Objective-C:在后台线程上启动一个对象 - 像往常一样进行交互?

Dev*_*Dev 5 iphone multithreading objective-c

我想从主线程中调用一个对象

MyObj* backgroundObject = [[MyObj alloc] initInBackground];
BOOL result = [backgroundObject computeResult];
Run Code Online (Sandbox Code Playgroud)

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

并且还有backgroundObj能够向其委托发送消息.我该怎么办?可能吗?

Bra*_*son 7

正如其他人所指出的那样,任何一个线程上都不存在NSObject,当你开始执行它的方法时,一个线程才会起作用.

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

如果你使这个NSOperationQueue的最大并发数为1,你还可以避免在后台线程上执行的各种操作之间锁定对象内的共享资源(当然你仍然需要锁定可能的实例变量)从外面进入).

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

请参阅并发编程指南为多.


Car*_*rum 6

当然,你可以使用NSThread针对这一点,必须backgroundObject使用performSelectorOnMainThread:联系委托.