iphone - Objective-C : Start an object on a background thread -- interact as usual?

标签 iphone objective-c multithreading

我想要一个可以从主线程调用的对象

MyObj* backgroundObject = [[MyObj alloc] initInBackground];
BOOL result = [backgroundObject computeResult];

但是让backgroundObject的所有方法在另一个线程中计算。

并且还让 backgroundObj 能够向它的委托(delegate)发送消息。我怎么能做这样的事?可能吗?

最佳答案

正如其他人所指出的,NSObject 不存在于任何一个线程中,只有当您开始执行其方法时,线程才会发挥作用。

我的建议是不要在每次调用对象的方法时都使用手动线程,而是使用 NSOperations 和 NSOperationQueue。将 NSOperationQueue 作为对象的实例变量,并调用对象上的各种方法创建插入到队列中的 NSOperations。 NSOperationQueue 将在后台线程上处理这些操作,避免了多次访问方法所需的所有手动线程管理。

如果你让这个 NSOperationQueue 的最大并发数为 1,你也可以避免在将在后台线程上执行的各种操作之间锁定对象内的共享资源(当然你仍然需要锁定实例变量可以从外部世界访问)。

对于委托(delegate)或其他对象的回调,我建议使用 -performSelectorOnMainThread:withObject:waitUntilDone 这样您就不必考虑使这些委托(delegate)方法成为线程安全的。

参见 Concurrency Programming Guide了解更多。

关于iphone - Objective-C : Start an object on a background thread -- interact as usual?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2419737/

相关文章:

c# - 在同一程序的多个实例之间同步

iphone - 如何在 CGAffineTransform 中传递值 Make

iphone - 在Objective-C中解析以@和#开头的字符串

iphone - 将 post 变量发送到 iOS 表单

multithreading - 为什么 Delphi 应用程序有多个线程?

javascript - 使用 Webworker 将 Javascript 函数作为线程调用

ios - 将iOS App从一个账户的Testflight转移到另一个账户

iphone - 如何在 Xcode 4 中安装 Cocos2d PROJECT 模板?

ios - 类的导出实例未分配

objective-c - IOS UIColor 结构体