2017-09-15 19 views
10

[Swift]Swift @escaping and Completion Handler

Xin chào, tôi đã hiểu 'Đóng cửa' của Swift chính xác hơn.

Nhưng @escapingCompletion Handler quá khó hiểu

Tôi đã tìm kiếm nhiều thông tin đăng và các văn bản chính thức của Swift, nhưng tôi stil cảm thấy không đủ

Đây là đoạn mã nguồn của văn bản chính thức

var completionHandlers: [()->Void] = [] 

func someFunctionWithEscapingClosure(completionHandler: @escaping()->Void){ 
    completionHandlers.append(completionHandler) 
} 
func someFunctionWithNoneescapingClosure(closure:()->Void){ 
    closure() 
} 

class SomeClass{ 
    var x:Int = 10 
    func doSomething(){ 
     someFunctionWithEscapingClosure { 
      self.x = 100 
      //not excute yet 
     } 
     someFunctionWithNoneescapingClosure { 
      x = 200 
     } 
    } 
} 
let instance = SomeClass() 
instance.doSomething() 
print(instance.x) 

completionHandlers.first?() 
print(instance.x) 

Tôi nghe nói rằng có hai cách và lý do sử dụng @esacping

Đầu tiên toring đóng cửa, thứ hai là Async điều hành mục đích

Và, từ bây giờ họ là những câu hỏi của tôi

Thứ nhất, nếu doSomething thực hiện sau đó someFunctionWithEscapingClosure sẽ thực hiện với tham số đóng cửa và đóng cửa đó sẽ được lưu trong mảng biến toàn cầu.

Tôi nghĩ rằng việc đóng cửa là {self.x = 100}

Làm thế nào self trong {self.x = 100} mà lưu trong biến toàn cầu completionHandlers có thể kết nối với instance rằng đối tượng của SomeClass?

Thứ hai, tôi hiểu được someFunctionWithEscapingClosure như thế này.

Để lưu trữ biến đóng cục bộ completionHandler thành biến toàn cục 'completionHandlers`, chúng tôi sử dụng từ khóa @escaping!

mà không @escaping từ khóa someFunctionWithEscapingClosure lợi nhuận, biến cục bộ completionHandler sẽ loại bỏ từ bộ nhớ

@escaping được giữ đóng cửa mà trong bộ nhớ

là quyền này?

Cuối cùng, tôi tự hỏi về sự tồn tại của ngữ pháp này.

Có lẽ đây là một câu hỏi rất thô sơ

nếu chúng ta muốn thực hiện một số chức năng sau khi một số chức năng cụ thể

lý do tại sao chúng ta không chỉ cần gọi một số chức năng sau khi gọi hàm cụ thể

là những gì sự khác biệt giữa sử dụng mẫu trên và sử dụng chức năng gọi lại thoát

cảm ơn bạn đã đọc câu hỏi dài và xin lỗi vì tôi không phải là người gốc

Trả lời

14

Trước hết, tôi muốn nói "Câu hỏi Rất tốt :)"

Hoàn Handler:

Giả sử người dùng sẽ được cập nhật một ứng dụng trong khi sử dụng nó.Bạn chắc chắn muốn thông báo cho người dùng khi nó được thực hiện. Bạn có thể muốn bật lên một hộp nói rằng, "Xin chúc mừng, bây giờ, bạn hoàn toàn có thể tận hưởng!"

Vì vậy, làm thế nào để bạn chạy một khối mã chỉ sau khi tải xuống đã được hoàn thành? Hơn nữa, làm thế nào để bạn animate đối tượng nhất định chỉ sau khi một bộ điều khiển xem đã được chuyển đến tiếp theo? Vâng, chúng ta sẽ tìm hiểu làm thế nào để thiết kế một giống như một ông chủ. Dựa trên danh sách từ vựng mở rộng của tôi, xử lý hoàn thành đại diện cho

Do stuff when things have been done

Để biết thêm chi tiết, vui lòng truy cập this blog post.

Liên kết này mang lại cho tôi sự rõ ràng hoàn chỉnh về trình xử lý hoàn thành (từ quan điểm của nhà phát triển, nó xác định chính xác những gì chúng tôi cần hiểu).

đóng cửa @escaping:

Khi bạn đang đi qua việc đóng cửa trong lập luận của một chức năng, sử dụng nó sau khi thân của hàm được thực thi và trả về biên dịch lại. Khi hàm kết thúc, phạm vi của phép đóng đã tồn tại và tồn tại trong bộ nhớ, cho đến khi việc đóng được thực thi.

Có một số cách để thoát khỏi đóng cửa ở hàm chứa:

  • Bảo quản: Khi bạn cần lưu trữ đóng cửa trong biến toàn cầu, tài sản hoặc bất kỳ lưu trữ khác mà tồn tại trong quá khứ ký ức về những chức năng gọi được thực thi và trả về trình biên dịch.

  • Thực thi không đồng bộ: Khi bạn đang thực hiện đóng không đồng bộ trên hàng đợi không mong muốn, hàng đợi sẽ giữ phần đóng trong bộ nhớ cho bạn, có thể được sử dụng trong tương lai. Trong trường hợp này bạn không có ý tưởng khi đóng cửa sẽ được thực hiện.

Khi bạn cố gắng sử dụng đóng cửa trong những kịch bản trình biên dịch Swift sẽ hiển thị các lỗi:

error screenshot

Để làm rõ thêm về chủ đề này, bạn có thể kiểm tra this post on Medium.

Tôi hy vọng bạn sẽ hiểu rõ từ liên kết này.

Nếu bạn vẫn có bất kỳ câu hỏi nào (nhưng trước tiên hãy chắc chắn đọc dòng liên kết này; giải thích rõ ràng), sau đó vui lòng chia sẻ nhận xét của bạn.

Cảm ơn

+0

liên kết của bạn rất hữu ích –

+0

Cảm ơn, hãy tận hưởng mã hóa trong Swift –

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