gpt4 book ai didi

ios - 调度组不阻止代码运行

转载 作者:行者123 更新时间:2023-12-01 15:58:20 29 4
gpt4 key购买 nike

我希望调度组中的代码在发生任何其他事情之前完成执行,这实质上是阻止应用程序执行任何操作,直到完成此代码。但是,我无法使调度组阻止其他代码运行。我已经在这里尝试了几乎所有建议,但是我不知道自己在想什么。

我的功能:

- (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()
})
}

最佳答案

实际上,这里没有任何障碍。 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");
}

当然,不能在iOS的主队列上调用 myFunction(因为它会阻塞并且您绝不能阻塞主队列)。而且,也不得在 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将立即返回(因此可以在主队列上运行),但是所有内容都应按顺序打印出来。

关于ios - 调度组不阻止代码运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43598488/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com