gpt4 book ai didi

ios - 用户在执行 dispatch_get_main_queue() 之前离开了当前 View

转载 作者:行者123 更新时间:2023-11-29 12:57:20 26 4
gpt4 key购买 nike

我想将所有读/写数据库操作放到后台队列中,并在完成时更新当前的 UI View 。

如果用户在我处理数据库时停留在 View 中,则没有问题。但是,如果用户在数据库操作完成之前离开该 View ,它将崩溃。伪代码如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

/* save data to database, needs some time */

dispatch_async(dispatch_get_main_queue(), ^{
// back to main queue, update UI if possible
// here may cause crash
[self.indicator stopAnimating];
[self.imageView ...];
});
});

最佳答案

尝试检查 View 是否仍在 View 层次结构中,并在 viewDidDisappear 方法中停止事件指示器的旋转。您可能还需要一个标志(下例中的 isNeedingUpdate)来指示 UI 是否已更新,因此如果用户在更新完成之前离开然后又回来,您可以执行适当的操作。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
if (self.view.window) { // will be nil if the view is not in the window hierarchy
dispatch_async(dispatch_get_main_queue(), ^{
[self.indicator stopAnimating];
[self.imageView ...];
self.isNeedingUpdate = NO;
});
}else{
self.isNeedingUpdate = YES;
});


-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if (isNeedingUpdate) {
// do whatever you need here to update the view if the use had gone away before the update was complete.
}
}


-(void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[self.indicator stopAnimating];
}

关于ios - 用户在执行 dispatch_get_main_queue() 之前离开了当前 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722197/

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