多线程如何在objective-c中工作?

时间:2011-08-08 11:45:04

标签: iphone objective-c ios multithreading

在我启动线程的场景中,我仍然可以访问父线程上的方法吗?是否有一种特定的方法来调用这种方法?如果是这样,它是什么?

注意:在我的场景中,两个线程都用于数据操作,它们不是与接口相关的线程(我知道这在.NET中被考虑,不知道它们在Objective-c中)。

3 个答案:

答案 0 :(得分:4)

在这种情况下,最好使用Grand Central Dispatch(GCD),而不是直接使用NSThead或NSOperation。

并发概述:http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008091

Grand Central Dispatch简介:http://cocoasamurai.blogspot.com/2009/09/guide-to-blocks-grand-central-dispatch.html

通过您的示例,您可以使用嵌入式调用进入Grand Central Dispatch来实现此功能:

dispatch_queue_t backgroundQueue = dispatch_queue_create("com.example.exampleQueue", 0);

dispatch_async(backgroundQueue, ^{

    // operate on data in the background here
    NSData *stuff = [self doSomethingComplex];

    dispatch_async(dispatch_get_main_queue(), ^{
    // Perform Task back in the main thread
        [viewController updateStuff:stuff];
    });
});

此方法是执行这些任务的首选方法。此外,通过利用块,您可以一目了然地理解代码,而无需在您的类中使用多个方法。

答案 1 :(得分:1)

根据定义,线程共享父线程的状态。在ObjectiveC中,如果你产生一个工作线程&想在主线程上调用一些方法,这可以这样做 -

[self performSelectorOnMainThread:@selector(someMethod:) withObject:nil waitUntilDone:NO];

答案 2 :(得分:1)

如果它们不是界面内容,或者可以产生一些你可以调用的界面内容,那么你可以随后调用,并且可以用任何语言执行任何常见的线程安全性操作,例如@syschronise(obj)NSLock。但如果它是导致界面内容的东西,那么你将不得不像'Srikar'写[self performSelectorOnMainThread:@selector(setDataCount:) withObject:count waitUntilDone:NO];那样将有效地将消息放到NSRunLoop提示上。