2017-04-01 28 views
6

我在視圖控制器中定義了以下代碼。被遺棄的承諾會發生什麼?

_ = accountService.getAccount() 

     .then { user -> Void in 

     self.txtBxUser.text = user.username 
     self.txtBxEmail.text = user.email 
    } 

getAccount發出REST API請求。

如果用戶在調用返回之前關閉了視圖控制器,回調鏈會發生什麼?它仍然運行,我認爲,它仍然是參考?

回答

2

值得注意的是,這是不是一個保留循環?它仍然運行,我認爲,它仍然是參考?

是的,它仍然運行。

預先警告說,封閉中對self的引用意味着它也保持對視圖控制器的引用,直到封閉結束運行。出於這個原因,如果有機會的視圖控制器可能被解僱,你可能想使用一個weak參考:

_ = accountService.getAccount().then { [weak self] user -> Void in 
    self?.txtBxUser.text = user.username 
    self?.txtBxEmail.text = user.email 
} 

理想情況下,你也應該getAccount撤銷,並取消它的視圖控制器的deinit

(注意,在FAQ - Should I be Concerned About Retain Cycles,在PromiseKit文檔指出,你不需要weak引用,這是正確的,它只是一個您是否介意被解僱的視圖控制器的釋放被延遲,直到之後的問題這個承諾就實現了。)

3

我應該關心保留週期嗎? tl; dr:在承諾處理程序中使用 self是安全的。

這是安全的:

somePromise.then { 
    self.doSomething() 
} 

提供somePromise解析,傳遞給然後將 發佈的功能,從而指定[weak self]是沒有必要的。

指定[unowned self]可能是危險的。

你在告訴我不要擔心保留週期?不,這只是 ,默認情況下,使用 PromiseKit時不會導致保留週期。但它仍然是可能的,例如:

self.handler = { 
    self.doSomething 
    self.doSomethingElse } 
somePromise.then(execute: self.handler) 

我們分配到 handler的封閉強烈保留selfhandler強烈保留self。 這是一個典型的保留週期。不要寫典型的保留週期!如果用戶退出調用返回前的視圖控制器,會發生什麼情況回​​電鏈

somePromise.then(execute: self.doSomething).then(execute: self.doSomethingElse) 

source

相關問題