在辅助线程中运行 Cocoa 块

Posted

技术标签:

【中文标题】在辅助线程中运行 Cocoa 块【英文标题】:Running Cocoa block in secondary thread 【发布时间】:2012-03-16 04:24:47 【问题描述】:

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

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

    NSManagedObjectContext *moc = [MYAPPDELEGATE managedObjectContext];

    /* do more stuff with param */

    [MYAPPDELEGATE saveManagedObjectContext];
];

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

【问题讨论】:

【参考方案1】:

在后台线程上做一些工作很容易:使用dispatch_async()-[NSOperationQueue addOperationWithBlock:] 或什至可能与您正在使用的服务器连接相关的东西(例如+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:])来触发您的块。 (查看文档中的任何一个以获取使用示例。)

如果您希望在后台线程上执行 Core Data 的工作,除非您使用的是 ios 5.0 或更高版本,否则它会变得很糟糕。 Apple 在Concurrency and Core Data 上针对 5.0 之前的案例进行了大量撰写,但新内容虽然对于您提议的简单用途来说要容易得多,但并没有很好的文档记录。不过,This question 应该会给你一个好的开始。

【讨论】:

【参考方案2】:

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

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

【讨论】:

无需更改 SomeServer 实现。您传递给它的块可以将工作分派到线程外队列。 @GrahamLee 这取决于 OP 是否想要一个特定的块或任何可能传递给服务器的块在不同的线程上运行。您的方法很好,但仅限于第一种情况;更改服务器会在所有情况下处理它。

以上是关于在辅助线程中运行 Cocoa 块的主要内容,如果未能解决你的问题,请参考以下文章

在C ++中是否可以从主线程中执行辅助线程中运行的函数?

线程同步机制-- 线程同步辅助类

从辅助线程调用主线程函数

辅助线程中的 OpenGL 渲染

如何通过辅助功能 API 获取当前选定文本的全局屏幕坐标。

WebKit 线程违规 - 从 UI 自动化中的辅助线程初始使用 WebKit