在单独的线程上运行代码的最佳方法是什么?是吗:
[NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL];
或者:
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(doStuff:)
object:nil;
[queue addOperation:operation];
[operation release];
[queue release];
我一直在做第二种方式,但我读过的Wesley Cookbook使用的是第一种方式。
答案 0 :(得分:242)
在我看来,最好的方法是使用libdispatch,即Grand Central Dispatch(GCD)。它限制你使用iOS 4及更高版本,但它非常简单易用。在后台线程上进行一些处理然后在主运行循环中对结果执行某些操作的代码非常简单和紧凑:
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Add code here to do background processing
//
//
dispatch_async( dispatch_get_main_queue(), ^{
// Add code here to update the UI/send notifications based on the
// results of the background processing
});
});
如果您还没有这样做,请在libdispatch / GCD / blocks上查看WWDC 2010中的视频。
答案 1 :(得分:1)
iOS中多线程的最佳方式是使用GCD(Grand Central Dispatch)。
//creates a queue.
dispatch_queue_t myQueue = dispatch_queue_create("unique_queue_name", NULL);
dispatch_async(myQueue, ^{
//stuffs to do in background thread
dispatch_async(dispatch_get_main_queue(), ^{
//stuffs to do in foreground thread, mostly UI updates
});
});
答案 2 :(得分:0)
我会尝试人们发布的所有技术,看看哪种技术最快,但我认为这是最好的方法。
[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];
答案 3 :(得分:0)
我在NSThread上添加了一个类别,可以让你轻松地在块中执行线程。您可以从这里复制代码。