gpt4 book ai didi

iOS GCD 线程处理 - View Controller 已关闭

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

考虑 ViewController 中的以下代码,该代码在用户单击按钮时运行:

var myBlock = {
[weak self] in
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
dispatch_async(queue) {
// Some heavy lifting code with final UI Feedback
let success = true
if(success) {
if let strongSelf = self {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// Tell user it was successful
strongSelf.label1.text = "SUCCESS!"
});
}
}
});
}

在发生重物提升的区域,假设有一个过程大约需要 5-10 秒。如果在此期间用户关闭此代码所在的 ViewController,后台线程是否会继续运行?如果是这样,当 success block 运行并尝试访问 UI 线程上的 UI 元素时,会发生什么?

最终,我试图了解在后台排队进程以尽可能更新 UI 的最佳实践。此外,如果用户按下主页按钮,此过程必须在后台继续完成。我读到您可以添加: UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler() 这是否意味着在线程内进行操作,如上所示?

我确信这有点菜鸟问题,但我确实可以在这里使用一些最佳实践指南。

谢谢!

最佳答案

当您在 block 中引用 self 时,会存储一个强引用,以便在执行之前保留该引用。最佳做法是创建一个弱 self 版本以避免保留周期。您可以像在 Objective C 中那样在 block 外创建弱版本来实现此目的:

__weak typeof(self) weakSelf = self;

在 Swift 中:

var myBlock = {
[weak self] in
//some work with self
}

并在 block 中访问 weakSelf 而不是 self。

接下来可以多了解一点link .

后台线程会继续运行,如果需要是可取消任务可以实现NSOperations。如果您可以在 block 内解包可选,则可以更新 UI。

关于beginBackgroundTaskWithExpirationHandler,它用于标记您即将开始的长任务的开始,并获得额外的时间来完成它(并在完成时通知),以防App后台运行,但如果它不能'届时不执行该应用程序将被终止。如果需要,您可以使用它,但它不能确保有时间完成您的任务。

关于iOS GCD 线程处理 - View Controller 已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29168825/

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