在iOS上将消息从后台线程发送到主线程

时间:2012-10-17 11:35:13

标签: iphone objective-c ios xcode multithreading

我有一个iOS应用程序,我在后台线程上完成任务。当每个任务完成后,我想向主线程发送一条消息,以便我可以将自定义进度条移动到适当的阶段。

实现这一目标的最简单但最安全的方法是什么?

编辑1

这是我正在使用的方法:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
                                         (unsigned long)NULL), ^(void) {

     // get background tasks done. 
     [self.background backgroundMethod];

});

编辑2

这是我尝试使用@Madboy答案的一个例子。在我在后台执行方法的类中,我有一个指向我的进度条的指针。我们认为这会起作用吗? (请注意对EDIT 1的更改)。

@implementation BackgroundClass
@synthesize delegate;
@synthesize customProgressBar

- (void)backgroundMethod
{
    // Run tasks
}

- (void)delegateSaysBackgroundMethodIsFinished
{
    [self performSelectorOnMainThread:@selector(tasksDone:) withObject:self.customProgressBar waitUntilDone:NO];

}

@implementation CustomProgressBar

- (void)tasksDone
{
    // change UI to reflect progress done. 
}

3 个答案:

答案 0 :(得分:10)

这是基于你正在做的事情。您是否在后台使用GCD执行任务?然后你可以打电话:

dispatch_async(dispatch_get_main_queue(), ^{
    //your main thread task here
});

如果你在NSThread中运行,你可以这样做:

[myObject performSelectorOnMainThread:YOURSELECTOR withObject:YOUROBJECT waitUntilDone:NO];

答案 1 :(得分:4)

您可以使用NSObjectperformSelectorOnMainThread:withObject:waitUntilDone:方法。

waitUntilDone参数是bool。您可以传递YES以使后台线程等到主线程上的方法完成。您可以传递NO以仅触发该方法并在主线程的同时继续在后台线程上执行。

答案 2 :(得分:0)

NSNotificationCenter允许线程之间的消息传递。您设置了一个“监听器”,然后可以广播通知 - Apple文档非常好,并且很容易接收。