私は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 をクラッシュさせます。これはなぜですか? . これをもう少しわかりやすくしてください!
//ありがとう!