在辅助线程中运行Cocoa块

时间:2012-03-16 04:24:47

标签: iphone ios macos cocoa

我有一个去服务器的电话。我希望这里的回调在不是UI线程的辅助线程中异步运行。核心数据在这里冻结,我想尝试让应用程序感觉更敏感。在次要线程中运行此回调的最佳方法是什么?代码示例会很棒!

[[SomeServer sharedInstance] doServerCallCallback:^(NSObject *param) {   

    NSManagedObjectContext *moc = [MYAPPDELEGATE managedObjectContext];

    /* do more stuff with param */

    [MYAPPDELEGATE saveManagedObjectContext];
}];

服务器调用本身不需要在辅助线程中,但是块中执行的代码应该是。

2 个答案:

答案 0 :(得分:1)

在后台线程中进行一些工作很容易:使用dispatch_async()-[NSOperationQueue addOperationWithBlock:]或甚至可能与您正在使用的服务器连接相关的内容触发阻止,例如+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:] 。 (查看文档中的任何用法示例。)

如果你想在你的后台线程上做Core Data的东西,除非你在iOS 5.0或更新版本上,否则它会变得很糟糕。对于5.0之前的情况,Apple在Concurrency and Core Data上有一个很大的文章,但是新的东西虽然比你提出的简单用途容易得多,但并没有很好的记录。 This question应该给你一个良好的开端。

答案 1 :(得分:0)

您传递的块是服务器将在某个时刻执行的对象。如果您希望在不同的线程上执行块,则需要更改SomeServer的-doServerCallCallback:实现。

有关使用块的完整信息,请参阅Grand Central Dispatch Reference手册。简而言之,服务器应该在启动时创建一个调度队列。然后,您可以使用dispatch_async()之类的函数来执行块。