我經常這樣做,弱自我去哪裏?
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
beep()
}
,並在一個應用程序,我們經常這樣做
tickle.fresh(){
msg in
paint()
}
但如果你這
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
tickle.fresh(){
msg in
paint()
}
}
當然
你必須做這
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) { [weak self] _ in
tickle.fresh(){
msg in
self?.paint()
}
}
或者,也許這
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
tickle.fresh(){
[weak self] msg in
self?.paint()
}
}
或者也許這
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) { [weak self] _ in
tickle.fresh(){
[weak self] msg in
self?.paint()
}
}
W¯¯牛逼^ h應該怎麼辦?
所有三個建議似乎完美地工作。這裏有什麼意思的深度?哪一個應該做?
而在最後一個,爲什麼你不得不說像[weak self?]
,因爲它是?
注 - 對不起,如果我不明確的,寓意是
func paint() {
paintSomething
let t = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: t) { weak maybe
tickle.fresh(){ weak maybe
guard self != nil else {
print("retired correctly!! hooray! thanks SO!")
return
}
self?.paint()
}
}
}
因此,我們將(比如,要求從雲遊戲信息,然後)油漆,等待兩秒鐘,這樣就夠了一次又一次;但當然你希望這個到一旦視圖控制器消失就完全停止。
- 一個問............是一個強參考弱參考,弱或強參考?
注:在我的例子,tickle.fresh(){}
只是調用一個單身或東西:,因爲它發生,它並不特別使用self
。所以,你可以這樣做:
func paint() {
paintSomething
let t = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: t) { [weak self] _ in
guard self != nil else {
print("retire early, don't even bother going to the cloud!")
print("thanks, SO!")
return
}
tickle.fresh(){ [weak self] _ in
guard self != nil else {
print("went to the cloud, then got retired!")
print("thanks, SO!")
return
}
self?.paint()
}
}
}
Bravo!這需要一些思考!在*處,「自我將被外部封閉保留,而不是內部封閉」。* ......實際上,這是否意味着「它會再做一次」(「即使視圖控制器在兩秒內消失」 )但這是它會做的最後一個「.. ??!?? ?? – Fattie
* wait * ..在當前最終代碼示例的第二行中,是否應該是'self!'?因爲「該代碼片段的第一行的自我」是一個可選的權利? – Fattie
@JoeBlow這意味着'self'會被外層閉包保持活動狀態,但是一旦它被執行,就可以在內層閉包執行前(假設它是異步執行的)釋放它。在最後一個例子中,我使用可選的綁定和'guard let'來解開虛弱的'self',給了我一個很強的參考:) – Hamish