我正在编写一款 iPhone 的客户端服务器应用程序。我有一个关于线程的问题。当我从设备访问在线数据库时,我需要在单独的线程上执行此操作,以避免冻结 UI / 主线程。但是,当响应从数据库获取的数据时,我会在主线程上调用此方法:performSelectorOnMainThread。问题是这只能让我向方法发送一个参数/对象(WithObject),有时我有更多要传递的参数。另一件事是我必须传递这个对象,如果我传递 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,应用程序也会崩溃。为什么会这样?请帮我澄清一下!
//谢谢!
detachNewThreadSelector
和performSelectorOnMainThread
。现在我们有了dispatch_*
和NSOperationQueue
。现在一切都变得更加容易了。通常情况下,如果你不需要在后台线程中更新UI,那么async
就可以正常工作。 - Yuji