如何在不立即执行select器的情况下创build不是主线程的NSThread

我想创build一个不是主线程的工作线程,所以我可以调用…

[self performSelector:@selector(doStuff) OnThread:self.myWorkerThread withObject:nil]; 

…在我的代码中的一堆地点。 我如何创build一个线程..任何线程,并将其分配给一个variables,所以我可以在我的代码中反复使用它。 NSThread detachNewThreadWithSElector只会创build一个用于运行该select器的目的。 我需要创build一个线程,并以某种方式使用它。

我正在使用iOS,并需要在writerThread上执行所有的CoreData写操作。 我需要每次都使用相同的线程(不是主线程)。

我强烈build议调查大中央调度:)。 你可以很容易地通过dispatch_queue_create创build一个调度队列,或者获得一个现有的并发线程并发送你想要的任何东西。 它将根据工作负载/操作系统状态等创build适当数量的线程。它将如下所示:

 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ //Do stuff }); 

或者你可以看看它的NS对手,NSOperation。 我不知道只有NSThread才能做到这一点。 似乎设置它的select器的唯一方法是用一个初始化它。

编辑如果你只想要一个线程,只需调用[[NSThread alloc] init] :p

进一步的编辑: iPhone:如何使用performSelector:onThread:withObject:waitUntilDone:方法?

按照这个答案,设置会很困难,因为每个线程在创build时都需要一个“主”function,否则它什么都不会做。

看起来最简单的方法是使用块:

 void (^now)(void) = ^ { NSDate *date = [NSDate date]; NSLog(@"The date and time is %@", date); }; 

并致电:

 now(); 

NSBlockOperation或dispatch_async()。

在这里看到更多: http : //pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

如果你真的想要这个,而不是使用GCD,那么:

 NSThread *thr = [[NSThread alloc] initWithTarget:anobject selector:@selector(doStuff) object:nil]; 

而且这将会在你的对象上调用适当的方法 – 但是,在我看来,NSThread的当前实现不允许改变目标和select器。

如果你正在做这个和Core Data交互(就像你的问题所build议的那样),并且你的应用可能需要iOS 5,那么你可能需要研究在iOS 5中添加的新的私有队列pipe理对象上下文。它创build和pipe理线程/调度队列,然后将其发送到队列中作为与之交互的方式。 有关更多详细信息,请参阅发行说明和WWDC会话video 。

更新 (2016年5月):在iOS 5中添加的新API是-[NSManagedObjectContext initWithConcurrencyType:] 。 从iOS 9开始,旧版本的初始化程序已经被弃用,并且已经推出了基于队列的并发types之前的默认的限制并发types。 所以,如果你不使用队列来pipe理上下文访问,我强烈build议朝这个方向前进。

我还强烈build议在开发过程中使用com.apple.CoreData.ConcurrencyDebug启动参数 ,以帮助您find违反规则的地方。