我有几个这样的方法调用:
[self myFoo];
[self heavyStuff]; // this one in other thread
[self myBar];
我需要查看哪些类/方法?当我搜索“线程”时,会出现很多类,方法和函数。哪一个最适合这里?
答案 0 :(得分:20)
你会做
[self performSelectorInBackground:@selector(heavyStuff) withObject:nil];
请参阅Apple网站上的NSObject reference。
答案 1 :(得分:15)
对于“火与忘记”,请尝试[self performSelectorInBackground:@selector(heavyStuff) withObject:nil]
。如果您有多个这样的操作,您可能需要查看NSOperation
及其子类NSInvocationOperation
。 NSOperationQueue
托管线程池,并发执行操作的数量,并包括通知或阻止方法,告诉您何时完成所有操作:
[self myFoo];
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(heavyStuff) object:nil];
[operationQueue addOperation:operation];
[operation release];
[self myBar];
...
[operationQueue waitUntilAllOperationsAreFinished]; //if you need to block until operations are finished
在较低级别,您可以使用-[NSThread detachNewThreadSelector:@selector(heavyStuff) toTarget:self withObject:nil]
。
答案 2 :(得分:7)
你在这里有很多很棒的指针,但不要忘记花些时间在Threading Programming Guide。它不仅提供了很好的技术指导,而且提供了良好的并发处理设计,以及如何更好地利用线程而不是线程来运行循环。
答案 3 :(得分:7)
如果您专门针对Snow Leopard,可以使用Grand Central Dispatch:
[self myFoo];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self heavyStuff];
dispatch_async(dispatch_get_main_queue(), ^{
[self myBar];
});
});
但它不会在早期的系统(或iPhone)上运行,而且可能有点过分。
编辑:自iOS 4.x开始,它适用于iPhone。
答案 4 :(得分:4)
您可以使用NSOperationQueue和NSInvocationOperation:
[self myFoo];
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(heavyStuff) object:nil];
[operationQueue addOperation:operation];
[self myBar];