我想要一个可以从主线程调用的对象
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/