我希望调度组中的代码在其他任何事情发生之前完成执行,实际上阻止应用程序执行任何操作,直到完成此代码。但是,我无法让调度组阻止其他代码运行。我已经在堆栈上尝试了几乎所有的建议,但我不知道我在做什么。
我的功能:
- (void)myFunction {
NSString *myString = @"Hello world";
dispatch_group_t group = dispatch_group_create();
NSLog(@"1 entering the dispatch group");
dispatch_group_enter(group);
[self doSomething:myString completion:^{
dispatch_group_leave(group);
NSLog(@"2 we have left the dispatch group");
}];
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"3 notifying that the dispatch group is finished");
}];
NSLog(@"4 all process are complete, we are done");
}
我希望通过日志语句输出= 1,2,3,4
我通过日志语句得到的输出= 1,4,2,3
为什么我的代码会跳过调度组并在2和3之前打印4?对于我做错的任何建议都表示赞赏。谢谢!
更新
这是我的doSomething
方法。我的代码一直挂在dismiss
电话上。
doSomething() {
viewController.dismiss(animated: false completion: { [weak self] in
doMoreCode()
})
}
答案 0 :(得分:3)
这里什么都没有阻止。 dispatch_group_notify
只是说“当小组结束时,运行它。”您打算使用的工具是dispatch_group_wait
。如果你想要1,2,3,4,那么你就是这个意思:
- (void)myFunction {
NSString *myString = @"Hello world";
dispatch_group_t group = dispatch_group_create();
NSLog(@"1 entering the dispatch group");
dispatch_group_enter(group);
[self doSomething:myString completion:^{
NSLog(@"2 we have left the dispatch group");
dispatch_group_leave(group);
}];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"3 notifying that the dispatch group is finished");
NSLog(@"4 all process are complete, we are done");
}
myFunction
当然不能在iOS的主队列上调用(因为它会阻塞,你必须永远不会阻塞主队列)。并且它也不能在doSomething:completion:
用于其完成处理程序的同一队列上调用(因为该队列将在dispatch_group_wait
处被阻止)。
请记住,dispatch_queue_notify
只是将一个块添加到将来某个时间运行的队列中。所以有点不清楚你期望3和4如何工作(在我的例子中我只是折叠它们,但也许你正在寻找别的东西)。
另一种方法是不阻止应用程序,并且只安排要运行的东西。在这种情况下,您可以使用主队列。它看起来像这样:
- (void)myFunction {
NSString *myString = @"Hello world";
dispatch_group_t group = dispatch_group_create();
NSLog(@"1 entering the dispatch group");
dispatch_group_enter(group);
[self doSomething:myString completion:^{
NSLog(@"2 we have left the dispatch group");
dispatch_group_leave(group);
}];
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"3 notifying that the dispatch group is finished");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"4 all process are complete, we are done");
});
}
请注意,在两个示例中,我都在调用dispatch_group_leave
之前记录2。在这个例子中,我还在组完成后注册了两个要在主队列上运行的东西(按顺序)。在这种情况下,myFunction
将立即返回(因此可以在主队列上运行),但所有内容都应按顺序打印出来。
答案 1 :(得分:1)