7

私はiPhoneにクライアントサーバーアプリを書いています。そして、スレッドについて質問があります。デバイスからオンライン データベースにアクセスするときは、UI/メイン スレッドがフリーズしないように別のスレッドでこれを行う必要があります。しかし、データベースから取得したデータに応答するときは、メイン スレッドでこのメソッドを呼び出します: performSelectorOnMainThread。問題は、これにより、メソッド (WithObject) に 1 つの引数/オブジェクトしか送信できず、渡したい引数がさらにある場合があるということです。それについてのもう 1 つのことは、この 1 つのオブジェクトを渡さなければならないということです。アプリがクラッシュした場合、nil を渡すことはできません。

これは今日の私のコードです..そして、メソッドを使用して間違った方法でスレッド化しているのではないかと心配しています。

- (IBAction)testServerAction:(id)sender {

    [self.imageView setHidden:YES];
    [self.activityView setHidden:NO];
    [self.activityView startAnimating];
    dispatch_queue_t testServer = dispatch_queue_create("Test-Server-Thread", NULL);
    dispatch_async(testServer, ^{

        if ([self.arrayWithServerConnections count] > 0)
        {
            NSString *messageToShow;
            if ([self testServerMethod])
            {
                messageToShow = @"Server is working!";
                [self performSelectorOnMainThread:@selector(showMessageBoxWithString:) withObject:messageToShow waitUntilDone:YES];
                [self performSelectorOnMainThread:@selector(threadedUIActivityRemover:) withObject:nil waitUntilDone:YES];
            }else
            {
                messageToShow = @"Server is NOT working!";
                [self performSelectorOnMainThread:@selector(showMessageBoxWithString:) withObject:messageToShow waitUntilDone:YES];
                [self performSelectorOnMainThread:@selector(threadedUIActivityRemover:) withObject:nil waitUntilDone:YES];
            }
        }

    });

    dispatch_release(testServer);
}

-(void)threadedUIActivityRemover:(NSString *)string
{
    [self.imageView setHidden:NO];
    [self.activityView setHidden:YES];
    [self.activityView stopAnimating];
}

これはこれを行う良い方法ですか? performSelectorOnMainThread 以外に、私に指摘できるものはありますか?

ご覧のとおり、この例では NSString 引数に nil を渡しています。何かを渡す必要があるためです。メソッドの引数として NSString がない場合、nil を渡すとアプリが evan をクラッシュさせます。これはなぜですか? . これをもう少しわかりやすくしてください!

//ありがとう!

4

4 に答える 4

10

さて、あなたはすでに を使用していますdispatch_async。次に、使用するだけです

     dispatch_async(dispatch_get_main_queue(),^ { ... } );

バックグラウンド スレッド内からメイン スレッドで処理を実行します。例えば、

     if ([self testServerMethod])
        {
            dispatch_async(dispatch_get_main_queue(),^ {
               [self showMessageBoxWithString: @"Server is working!"];
               [self threadedUIActivityRemover:nil];
            } );
        }else ...

呼び出すメソッドの引数の数に制限はありません。

于 2011-08-29T16:40:32.607 に答える
2

アーカイブされていないオブジェクトの辞書などのコレクションを渡します。

于 2011-08-29T16:41:22.087 に答える
1

を使用することもできますNSInvocation

于 2011-08-29T16:43:59.950 に答える
0

インスタンス変数を渡しているため、別のオプションとして、self を渡して self をスレッド セーフにすることもできます。

于 2011-08-29T16:46:52.273 に答える