等到后台选择器完成以调用新方法

时间:2012-06-21 21:49:12

标签: objective-c ios cocoa-touch background-process

我正试图在我的观点负载上从互联网上获取数据。为了不滞后用户界面,我正在使用

执行HTML下载和解析
[self performSelectorInBackground:@selector(alertThreadMethod) withObject:nil];

检查在线是否有警报。但是为了在视图上显示信息,iOS表示我需要使用主线程。所以我在之后调用显示代码:

[self performSelectorInBackground:@selector(alertThreadMethod) withObject:nil];
[self loadAlert];

在执行此操作时,[self loadAlert];实际上在后台选择器之前运行(它更快)。因此,它没有后台选择器提供它的信息。

如何确保[self loadAlert];之后运行?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

您可以将loadAlert调用移动到alertThreadMethod或使用Grand Central Dispatch串行队列,例如,

dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_async(queue, ^{
    [self alertThreadMethod];
    [self loadAlert];
});
dispatch_release(queue);

或者,如果loadAlert正在更新UI,那么由于您在主队列中进行UI更新,您可以执行以下操作:

dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_async(queue, ^{
    [self alertThreadMethod];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self loadAlert];
    });
});
dispatch_release(queue);

顺便说一句,如果你只是在后台执行这一项任务,而不是创建自己的串行队列,那么你可能只使用一个现有的后台队列。如果需要串行特性,您只需要创建一个队列(即,您将要进行多次dispatch_async调用,并且不能让它们同时运行)。但在这个简单的情况下,这可能会更有效,绕过串行队列的创建和释放:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
    [self alertThreadMethod];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self loadAlert];
    });
});

答案 1 :(得分:1)

在alertThreadMethod中,获得信息后,调用方法performSelectorOnMainThread:withObject:waitUntilDone:并将选择器传递给loadAlert方法。

-(void)alertThreadMethod
{
   // get your information here

   performSelectorOnMainThread:@selector(loadAlert) withObject:nil waitUntilDone:NO
}