我有一个去服务器的电话。我希望这里的回调在不是UI线程的辅助线程中异步运行。核心数据在这里冻结,我想尝试让应用程序感觉更敏感。在次要线程中运行此回调的最佳方法是什么?代码示例会很棒!
[[SomeServer sharedInstance] doServerCallCallback:^(NSObject *param) {
NSManagedObjectContext *moc = [MYAPPDELEGATE managedObjectContext];
/* do more stuff with param */
[MYAPPDELEGATE saveManagedObjectContext];
}];
服务器调用本身不需要在辅助线程中,但是块中执行的代码应该是。
答案 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()
之类的函数来执行块。