我想创建一个不是主线程的工作线程,所以我可以调用...
[self performSelector:@selector(doStuff) OnThread:self.myWorkerThread withObject:nil];
...在我的代码中的一堆位置。如何创建线程..任何线程并将其分配给变量,以便我可以在我的代码中反复使用它。 NSThread detachNewThreadWithSElector只会创建一个用于运行该选择器的目的。我需要创建一个线程并以某种方式使用它。
我使用的是iOS,需要在writerThread上执行所有CoreData写操作。我每次都需要使用相同的线程(不是主线程)。
答案 0 :(得分:4)
我强烈建议您选择Grand Central Dispatch :)。您可以通过dispatch_queue_create轻松创建调度队列,或者获取其中一个现有并发线程并发送您想要的任何内容。它将根据工作负载/操作系统状态等创建适当数量的线程。它将如下所示:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
//Do stuff
});
或者您可以查看其NS对应的NSOperation。我不知道如何用NSThread做到这一点。似乎设置其选择器的唯一方法是使用一个来初始化它。
修改强>
如果您只想要一个主题,只需致电[[NSThread alloc] init]
:p
进一步编辑: iPhone: how to use performSelector:onThread:withObject:waitUntilDone: method?
根据这个答案,设置起来会很困难,因为每个线程在创建时都需要“主”功能,否则它什么也不做......
答案 1 :(得分:2)
似乎最简单的方法是使用块:
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
答案 2 :(得分:2)
如果你真的想要这个并且不使用GCD,那么:
NSThread *thr = [[NSThread alloc] initWithTarget:anobject selector:@selector(doStuff) object:nil];
这会在你想要的时候在你的对象上调用适当的方法 - 但是,在我看来,NSThread的当前实现不允许更改目标和选择器。
答案 3 :(得分:1)
如果您专门用于与Core Data交互(正如您的问题所示),并且您可以为您的应用程序要求iOS 5,则可能需要调查在iOS 5中添加的新的专用队列托管对象上下文。它创建并为您管理线程/调度队列,并将其发送到队列上以作为与其交互的方式运行。有关详细信息,请参阅the release notes和WWDC session video。
更新(2016年5月):iOS 5中添加的新API为-[NSManagedObjectContext initWithConcurrencyType:]
。从iOS 9开始,不推荐使用旧的初始化程序,以及在引入基于队列的并发类型之前默认的限制并发类型。因此,如果您不使用队列来管理上下文访问,我强烈建议您朝着这个方向前进。
在你开发的过程中,我也强烈推荐using the com.apple.CoreData.ConcurrencyDebug
launch argument,以帮助你找到违反规则的地方。