0

我有一个我正在尝试创建的过程,我在其中下载不同的 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..."];
});

如果有人可以为正确使用队列的方法提供帮助,以便我的应用程序不会锁定,我将不胜感激。谢谢!

4

2 回答 2

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];
    });
});
于 2012-08-14T14:30:14.307 回答
0

听起来您希望它们按顺序执行,并随着它们的进展更新 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);
于 2012-08-15T04:44:00.650 回答