2017-04-01 3 views
6

Ich habe den folgenden Code in einem View-Controller definiert.Was passiert mit einem Versprechen, das aufgegeben wurde?

_ = accountService.getAccount() 

     .then { user -> Void in 

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

getAccount macht eine REST-API-Anfrage.

Wenn der Benutzer den Ansichtscontroller vor der Rückkehr des Anrufs ablehnt, was passiert dann mit der Rückrufkette? Läuft es immer noch, vorausgesetzt, dass es immer noch referenziert wird?

Antwort

2

Wenn der Benutzer den View-Controller verwirft, bevor der Anruf zurückgekehrt ist, was mit dem Anruf geschieht Kette zurück? Läuft es immer noch, vorausgesetzt, dass es immer noch referenziert wird?

Ja, es läuft noch.

Seien Sie gewarnt, dass der Verweis auf self im Verschluss bedeutet, dass es auch einen Verweis auf den View-Controller hält, bis der then Abschluss beendet wird. Aus diesem Grunde, wenn es eine Chance gibt, die View-Controller abgewiesen worden sein könnten, mögen Sie vielleicht eine weak Referenz verwenden:

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

Idealerweise sollten Sie auch getAccount kündbare und kündigen sie in dem View-Controller der deinit machen.

(Beachten Sie, in FAQ - Should I be Concerned About Retain Cycles weist die PromiseKit Dokumentation heraus, dass Sie nicht weak Referenzen benötigen, was richtig ist. Es ist nur eine Frage, ob oder nicht Sie etwas dagegen, wenn die Freigabe des entlassenen View-Controller erst nach Aufschub das Versprechen ist erfüllt.)

3

Sollte ich über Retain-Zyklen besorgt sein? tl; dr: es ist sicher zu bedienen selbst in Versprechen Handler.

Dies ist sicher:

somePromise.then { 
    self.doSomething() 
} 

bereitgestellt somePromise löst, übergeben die Funktion wird freigegeben dann sein, so [weak self] Angabe nicht erforderlich ist.

Die Angabe [unowned self] ist wahrscheinlich gefährlich.

Sie sagen mir, dass ich mich nicht um Retain-Zyklen kümmern soll ?! Nein, es ist nur , dass Sie bei der Verwendung von PromiseKit standardmäßig keine Retain-Zyklen verursachen. Aber es ist immer noch möglich, zum Beispiel:

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

Der Verschluss wir zuweisen handler stark behält self. handler wird stark von self beibehalten. Es ist ein typischer Retain-Zyklus. Schreiben Sie keine typischen Retain-Zyklen!

Bemerkenswert ist, dies ist ein nicht-Zyklus beibehalten:

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

source

Verwandte Themen