Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何创建一个非';t在不立即执行选择器的情况下关闭主线程_Ios_Nsthread - Fatal编程技术网

Ios 如何创建一个非';t在不立即执行选择器的情况下关闭主线程

Ios 如何创建一个非';t在不立即执行选择器的情况下关闭主线程,ios,nsthread,Ios,Nsthread,我想创建一个不是主线程的工作线程,这样我就可以调用 [self performSelector:@selector(doStuff) OnThread:self.myWorkerThread withObject:nil]; 。。。在我的代码中的一堆位置。如何创建线程。。任何线程,并将其分配给变量,以便我可以在代码中反复使用它。NSThread detachNewThreadWithSElector将仅为运行该选择器而创建一个选择器。我需要创建一个线程并以某种方式使用它 我正在使用iOS,需要

我想创建一个不是主线程的工作线程,这样我就可以调用

[self performSelector:@selector(doStuff) OnThread:self.myWorkerThread withObject:nil];
。。。在我的代码中的一堆位置。如何创建线程。。任何线程,并将其分配给变量,以便我可以在代码中反复使用它。NSThread detachNewThreadWithSElector将仅为运行该选择器而创建一个选择器。我需要创建一个线程并以某种方式使用它


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

我强烈建议改为查看中央大调度:)。您可以通过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

进一步编辑:


根据这个答案,设置起来会很困难,因为每个线程在创建时都需要一个“main”函数,否则它将什么也不做……

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

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

now();
NSBlockOperation或dispatch_async()


请参阅此处的更多信息:

如果您专门这样做是为了与核心数据交互(如您的问题所示),并且您的应用程序可能需要iOS 5,那么您可能需要调查iOS 5中添加的新私有队列管理对象上下文。它为您创建和管理线程/调度队列,并将其发送到队列上运行,作为与之交互的一种方式。有关更多详细信息,请参阅和

更新(2016年5月):iOS 5中添加的新API是
-[NSManagedObjectContext initWithConcurrencyType:
。从iOS 9开始,较旧的初始值设定项以及在引入基于队列的并发类型之前默认的限制并发类型都已被弃用。因此,如果您不使用队列来管理上下文访问,我强烈建议您朝这个方向发展


我还强烈建议您在开发过程中,帮助您找到违反规则的地方。

如果您确实希望这样做而不使用GCD,那么:

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

这将在您需要时调用对象上的适当方法-但是,在我看来,NSThread的当前实现不允许更改目标和选择器。

我在iOS上。。。它们不是只有mac吗?iOS上不使用块。您使用的是什么SDK?它们在4和5中受支持。如果我使用performSelectorWithThread:[NSThread Main Thread]它可以正常工作,但是performSelectorWithThread:[NSThread alloc]init]会冻结并且不执行任何操作:(…我尝试在分配完后调用“start”,但它没有任何作用。抱歉:我对文档的极度缺乏感到沮丧。我不应该在这里把它拿出来。删除注释。没问题。这是一种常见的沮丧。如果你对此有一个积极的问题,也许我可以帮助回答。这与我想要的相反。定期我只想写入核心数据,我想在指定的线程(启动时)上这样做,这样我就不必有多个NSManagedObjectContext。所以我需要执行SelectionThread:missing:[thr start];:)链接无效-这就是为什么你应该在答案中包含链接中的一些内容。