iOS:如何在不中断对方的情况下执行块执行?

时间:2012-08-14 14:06:44

标签: ios ios5 xcode4 queue grand-central-dispatch

我有一个我正在尝试创建的进程,我下载不同的xml文件并从网站解析它们。目前我可以通过使用......来获得所有工作。

dispatch_async(dispatch_get_current_queue(),^ { [self updatePersons]; });
dispatch_async(dispatch_get_current_queue(),^ { [self updatePlaces]; });
dispatch_async(dispatch_get_current_queue(),^ { [self updatePositions]; });
dispatch_async(dispatch_get_current_queue(),^ { [self updateContacts]; });

这会锁定主线程,因为我正在使用dispatch_get_current_queue。如何在不中断对方的情况下执行这些操作,这在尝试下面的方法时似乎就是这种情况。

dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePersons]; });

我正在使用的完整版本的代码如下所示,但根据我的日志输出会发生的事情是它们同时执行(如果我理解了一切,我得到的就是目的);然而,他们的代码永远不会真正完成......我无法判断是否所有内容都通过日志输出进行解析,主屏幕保持冻结状态。该日志仅显示应显示的部分日志...似乎被其他进程的NSLog消息中断。

dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePersons]; });
dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePlaces]; });
dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePositions]; });
dispatch_async(dispatch_get_global_queue(0,0),^ { [self updateContacts]; });

dispatch_async(dispatch_get_global_queue(-2,0),^ { 

            dispatch_async(dispatch_get_main_queue(),^  {[self setBottomBarToUpdated]; });
 });

我正在尝试为应用程序创建一种方法,通过上面的每个函数来提取信息,同时通过底栏上的标签更新用户的进度。我通过在四个函数中使用以下代码来更新文本似乎正常工作......

dispatch_async(dispatch_get_main_queue(),^ {
         [self setBottomBarToUpdating:@"Updating Places..."];
});

如果有人可以提供正确使用队列的帮助,那么我的应用程序不会锁定,我会非常感激。谢谢!

2 个答案:

答案 0 :(得分:3)

如果您创建自己的专用并发调度队列,则可以使用“屏障块”。只有在完成所有其他先前提交的块时,才会执行此块。

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

// These blocks are executed concurrently:
dispatch_async(queue, ^ { [self updatePersons]; });
dispatch_async(queue, ^ { [self updatePlaces]; });
// ...

dispatch_barrier_async(queue, ^ {
    // This will be executed when all previous blocks are finished.
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdated];
    });
});

答案 1 :(得分:0)

听起来您希望它们按顺序执行,并在UI进行时更新UI。如果是这样,您可以使用串行队列:

dispatch_queue_t serialQueue = dispatch_queue_create("com.company.MyQueue", NULL);

dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Persons..."];
    }
    [self updatePersons]; 
});
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Places..."];
    }
    [self updatePlaces]; 
});
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Positions..."];
    }
    [self updatePositions]; 
});
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Contacts..."];
    }
    [self updateContacts]; 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Finished updating"];
    }
});

dispatch_release(serialQueue);