2017-04-01 16 views
6

Tôi có mã sau được xác định trong bộ điều khiển chế độ xem.Điều gì sẽ xảy ra với lời hứa bị bỏ rơi?

_ = accountService.getAccount() 

     .then { user -> Void in 

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

getAccount thực hiện yêu cầu REST API.

Nếu người dùng loại bỏ trình điều khiển chế độ xem trước khi cuộc gọi trở lại, điều gì sẽ xảy ra với chuỗi cuộc gọi trở lại? Liệu nó vẫn chạy cho rằng, tôi đoán, nó vẫn được tham chiếu?

Trả lời

2

Nếu người dùng đã bác bỏ điều khiển xem trước khi cuộc gọi đã trở lại, những gì xảy ra với cuộc gọi trở lại chuỗi? Liệu nó vẫn chạy cho rằng, tôi đoán, nó vẫn được tham chiếu?

Có, nó vẫn chạy.

Hãy cảnh báo rằng tham chiếu đến self trong phần đóng có nghĩa là nó cũng giữ tham chiếu đến bộ điều khiển chế độ xem cho đến khi quá trình đóng mở then kết thúc. Vì lý do đó, nếu có một cơ hội điều khiển xem có thể đã bị sa thải, bạn có thể muốn sử dụng một tài liệu tham khảo weak:

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

Lý tưởng nhất, bạn cũng nên đảm getAccount hủy và hủy bỏ nó trong bộ điều khiển quan điểm của deinit.

(Lưu ý, trong FAQ - Should I be Concerned About Retain Cycles, tài liệu PromiseKit chỉ ra rằng bạn không cần tài liệu tham khảo weak, đó là câu hỏi liệu bạn có phiền không nếu việc xử lý của bộ điều khiển xem bị loại bỏ được hoãn lại cho đến sau lời hứa được đáp ứng.)

3

Tôi có nên quan tâm đến các chu kỳ lưu giữ không? tl; dr: an toàn để sử dụng tự xử lý lời hứa.

Đây là an toàn:

somePromise
somePromise.then { 
    self.doSomething() 
} 

Cung cấp giải quyết, các hàm được chuyển vào sau đó sẽ được phát hành, do đó quy định cụ thể [weak self] là không cần thiết.

Chỉ định [unowned self] có thể nguy hiểm.

Bạn đang yêu cầu tôi không phải lo lắng về việc duy trì chu kỳ ?! Không, chỉ là rằng theo mặc định bạn sẽ không gây ra các chu kỳ lưu giữ khi sử dụng PromiseKit. Nhưng nó vẫn còn có thể, ví dụ:

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

Việc đóng cửa chúng ta gán cho handler mạnh mẽ giữ self. handler được giữ lại mạnh mẽ bởi self. Đó là chu kỳ lưu giữ điển hình. Không viết chu kỳ lưu giữ điển hình!

Đáng chú ý, đây không phải một giữ lại chu kỳ:

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

source

Các vấn đề liên quan