如何在不立即执行选择器的情况下创建不是主线程的NSThread

时间:2012-03-30 02:37:09

标签: ios nsthread

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

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

...在我的代码中的一堆位置。如何创建线程..任何线程并将其分配给变量,以便我可以在我的代码中反复使用它。 NSThread detachNewThreadWithSElector只会创建一个用于运行该选择器的目的。我需要创建一个线程并以某种方式使用它。

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

4 个答案:

答案 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 notesWWDC session video

更新(2016年5月):iOS 5中添加的新API为-[NSManagedObjectContext initWithConcurrencyType:]。从iOS 9开始,不推荐使用旧的初始化程序,以及在引入基于队列的并发类型之前默认的限制并发类型。因此,如果您不使用队列来管理上下文访问,我强烈建议您朝着这个方向前进。

在你开发的过程中,我也强烈推荐using the com.apple.CoreData.ConcurrencyDebug launch argument,以帮助你找到违反规则的地方。