2010-08-18 182 views
0

嘿,我在多线程中遇到问题。 为了描述这一点,我有两个线程。 在主线程上,我有一些逻辑 而在另一个线程上,我有一个逻辑和一些用于UI的逻辑来更新UI。 我想要做的是在另一个线程上的UI更新后,我想调用某种方法。 我想我应该使用NSOperationQueue什么的。或后台队列。 但我已阅读并发编程和线程指南,我仍然不知道如何去做。多线程问题(UI未更新)

那么如何做到这一点,以便我可以在线程完成后调用方法? 谢谢!

回答

3

您不应该从主线程以外的任何线程触摸UI。线程之间发送形式交往的两种简单的方法:

performSelector:

[someObject performSelectorOnMainThread:@selector(someSelector) withObject:nil waitUntilDone:NO]; 

声明:

NSNotification *notification = [NSNotification notificationWithName:@"myNotification" object:nil]; 
[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:NO]; 

你当然也可以使用一个NSOperationQueue和键 - 值观察作业的成品性能,但除非您因其他原因需要它,否则会增加不必要的复杂性。

+0

NSNotifications他们在从被张贴在同一线程上收到的,所以第二个例子中需要使用performSelectorOnMainThread:为好。 (和一个小的错字@selector(postNotification)缺少':'。) – 2010-08-18 14:40:40

+0

我很肯定KVO也在同一个线程上运行,所以你要执行SelectorOnMainThread: – JeremyP 2010-08-18 15:37:40

+0

@Vincent Gable:你不需要选择器末尾的冒号。从文档:该方法不应该有一个显着的返回值,应该采用类型id,**或没有参数**的单个参数。 http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000050-CJBEHAEF – JeremyP 2010-08-18 15:39:14

0

这里是最好的方式,如果你使用的是iOS 4.0:

dispatch_async(dispatch_get_main_queue(), ^{ 
    // update the UI here... 
});