UIView
を作成しており、多くの非同期タスクをUIViewController
で実行しています。ある時点で、UIView
を削除して、実行中のすべてのタスクを停止したいと考えています。ただし、removeFromSuperview()
コールはタスクを停止しません。私はそれを行うことができる方法はありますか?すべての非同期タスクをUIViewで中止する
サンプルコード
class ViewController: UIViewController {
let v = SomeView()
override func viewDidLoad() {
super.viewDidLoad()
v.frame = CGRect(x: 0, y: 0, width: 10, height: 10)
self.view.addSubview(v)
let v1 = UIButton()
v1.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
v1.backgroundColor = UIColor.blue
v1.addTarget(self, action: #selector(removeV(_:)), for: .touchUpInside)
self.view.addSubview(v1)
}
func removeV(_ sender: UIButton) {
print("V REMOVED")
v.removeFromSuperview()
}
}
class SomeView: UIView {
override func draw(_ rect: CGRect) {
DispatchQueue.global().async {
var c = 0
while true {
print(String(c) + " DOING SOME TASK")
c += 1
sleep(1)
}
}
}
}
例ログ
0 DOING SOME TASK
1 DOING SOME TASK
V REMOVED
2 DOING SOME TASK
3 DOING SOME TASK
4 DOING SOME TASK
...
これは、あるタスクが長期間にわたって行われていることを示す例です。ビューを削除すると、そのようなタスクはすべて停止します。 –