Предполагается, что эта функция позволяет запланировать выполнение рабочего элемента:
class MyClass {
var id: String?
var workItem: DispatchWorkItem?
var isDoing = false
func myFunction() {
guard let id = self.id else { return }
isDoing = true
NotificationCenter.default.post(name: MyNotification, object: nil, userInfo: ["id": id])
workItem?.cancel()
workItem = DispatchWorkItem {
self.isDoing = false
NotificationCenter.default.post(name: MyNotification, object: nil, userInfo: ["id": id])
}
if let workItem = workItem {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(10), execute: workItem)
}
}
}
При разработке работает нормально, но дизайн кажется подозрительным, поэтому я задаю несколько основных вопросов:
- Может
workItem
быть нулем, если workItem?.cancel()
вызывается непосредственно перед тем, как очередь пытается выполнить workItem
? - Может
id
внутри workItem
когда-либо быть нулем, когда workItem
выполняется или сохраняется областью let id = self.id
? - Может ли
isDoing
внутри workItem
быть уже освобожден при выполнении workItem
, если объект MyClass
был освобожден?Другими словами, что происходит с запланированным workItem
, когда объект MyClass
освобождается?