在我启动线程的场景中,我仍然可以访问父线程上的方法吗?是否有一种特定的方法来调用这种方法?如果是这样,它是什么?
注意:在我的场景中,两个线程都用于数据操作,它们不是与接口相关的线程(我知道这在.NET中被考虑,不知道它们在Objective-c中)。
答案 0 :(得分:4)
在这种情况下,最好使用Grand Central Dispatch(GCD),而不是直接使用NSThead或NSOperation。
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
提示上。