gpt4 book ai didi

swift - 如何运行仅在使用该线程的 View 出现时才运行的异步线程?

转载 作者:行者123 更新时间:2023-11-30 13:05:32 24 4
gpt4 key购买 nike

如何运行一个异步线程,该线程仅在使用该线程的 View 出现时运行?

我希望 View 运行这个异步线程。但是,一旦 View 消失,我希望该线程停止运行。最好的方法是什么?我不知道从哪里开始,并且可能以错误的方式思考这个问题。尽管如此,我所描述的是我希望它对用户的行为方式。

最佳答案

你可以使用NSOperation来实现你想要的,NSOperation和NSOperationQueue是建立在GCD之上的。作为一条非常普遍的规则,Apple 建议使用最高级别的抽象,然后在测量表明需要时降至较低级别。

例如,您希望在 View 加载时异步下载图像,并在 View 消失时取消任务。首先为 NSOperation 创建一个 ImageDownloader 对象子类。请注意,我们检查操作是否被取消两次,这是因为 NSOperation 有 3 个状态:isReady -> isExecuting -> isFinish 并且当操作开始执行时,它不会自动取消,我们需要我们自己做。

class ImageDownloader: NSOperation {
//1
var photoRecord: NSURL = NSURL(string: "fortest")!

//2
init(photoRecord: NSURL) {
self.photoRecord = photoRecord
}

//3
override func main() {
//4
if self.cancelled {
return
}
//5
let imageData = NSData(contentsOfURL:self.photoRecord)

//6
if self.cancelled {
return
}

}
}

然后你可以像这样使用它:downloader.cancel()downloader.start()。请注意,我们需要检查操作是否在完成 block 中被取消。

import UIKit

class ViewController: UIViewController {
let downloder = ImageDownloader(photoRecord: NSURL(string: "test")!)

override func viewDidLoad() {
super.viewDidLoad()

downloder.completionBlock = {
if self.downloder.cancelled {
return
}
print("image downloaded")
}
//Start the task when the view is loaded
downloder.start()
}

override func viewWillDisappear(animated: Bool) {
//Cancel the task when the view will disappear
downloder.cancel()

}

}

关于swift - 如何运行仅在使用该线程的 View 出现时才运行的异步线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421698/

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