gpt4 book ai didi

ios - iOS 中如何避免回调 hell ?

转载 作者:行者123 更新时间:2023-11-29 00:26:10 25 4
gpt4 key购买 nike

在以下或类似情况下如何避免回调 hell ,

[self saveSomethingToTheServerWithCompletion:^(BOOL saveSucceeded) {
dispatch_async(dispatch_get_main_queue(), ^{
[self dismissViewControllerAnimated:YES completion:^{
dispatch_async(dispatch_get_main_queue(), ^{
if (saveSucceeded) {
[self showAlertControllerWithTitle:@"Message" message:@"Save successful."];
} else {
[self showAlertControllerWithTitle:@"Message" message:@"Save failed."];
}
});
}];
});
}];

我的理解是 dismissViewControllerAnimated:completion:showAlertControllerWithTitle:message: 必须在主线程上执行。

最佳答案

这个问题相当模糊,所以我对你的问题进行了最好的猜测。我唯一能想到的是你对嵌套调用不满意。你可以在一定程度上用方法来整理它。例如你知道显示警报总是需要在主线程上完成,所以将主线程代码移到你的警报方法中:

[self saveSomethingToTheServerWithCompletion:^(BOOL saveSucceeded) {
dispatch_async(dispatch_get_main_queue(), ^{
[self dismissViewControllerAnimated:YES completion:^{
NSString *message = saveSucceeded ? @"Save successful." : @"Save failed.";
[self showAlertControllerWithTitle:@"Message" message:message];
}];
});
}];

- (void)showAlertControllerWithTitle:(NSString *)title message:(NSString *)message {
dispatch_async(dispatch_get_main_queue(), ^{
//Show alert;
}
}

此外,您可以考虑从 dismissViewControllerAnimated 调用中移除完成 block 。也就是说,是否显示您的警报真的取决于 View Controller 是否已解除?

[self saveSomethingToTheServerWithCompletion:^(BOOL saveSucceeded) {
dispatch_async(dispatch_get_main_queue(), ^{
NSString *message = saveSucceeded ? @"Save successful." : @"Save failed.";
[self showAlertControllerWithTitle:@"Message" message:message];
[self dismissViewControllerAnimated:YES completion:nil];
});
}];

但最终,有时您只需要嵌套回调。这并没有什么错。

编辑: 我还没有真正考虑就用三元语句替换了您的 if 语句。不确定您是否将其视为“回调 hell ”。

关于ios - iOS 中如何避免回调 hell ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42967543/

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