Cocoa Touch线程问题

时间:2011-08-25 16:19:24

标签: objective-c ios multithreading nsnotificationcenter

我正在为iOS编写多线程应用程序。 我是Objective-C的新手,所以我之前没有玩iPhone中的线程。

通常在使用Java时,我创建一个线程,并将“self”作为对象发送给线程。从线程我可以调用主线程。 如何在Objective C中完成?

如何从线程调用主线程?我一直在尝试使用NSNotificationCenter,但是我收到了一个sigbart错误:/

这是线程的启动方式:

NSArray *extraParams = [NSArray arrayWithObjects:savedUserName, serverInfo, nil];       // Parameters to pass to thread object

NSThread *myThread = [[NSThread alloc] initWithTarget:statusGetter                      // New thread with statusGetter
                                             selector:@selector(getStatusFromServer:)   // run method in statusGetter
                                               object:extraParams];                     // parameters passed as arraylist
[myThread start];                                                                       // Thread started

activityContainerView.hidden = NO;
[activityIndicator startAnimating];

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:1)

通过向主线程的运行循环添加消息来实现此目的。

基金会为此提供了一些便利,特别是-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]NSInvocation

使用前者,您可以简单地写出:

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

可以从辅助线程(通常是调用线程)调度通知。

答案 1 :(得分:1)

您可以使用performSelectorOnMainThread:withObject:waitUntilDone:,或者,如果您的目标是iOS 4及更高版本,则可以使用Grand Central Dispatch,它不需要您实现仅与主线程同步的方法:

dispatch_async(dispatch_get_main_queue(), ^ {
    // Do stuff on the main thread here...
});

这通常使您的代码更易于阅读。

答案 2 :(得分:0)

虽然这不是您问题的直接答案,但我强烈建议您查看Grand Central Dispatch。它通常比直接使用线程提供更好的性能。

Justin指出,如果你真的需要,你可以通过调用performSelectorOnMainThread来在主线程中执行一个函数。