2015-05-22 15 views
63

Tôi chỉ tò mò về cách tôi tiếp cận điều này. Nếu tôi có một chức năng, và tôi muốn một cái gì đó xảy ra khi nó được thực hiện đầy đủ, làm thế nào tôi sẽ thêm điều này vào chức năng? Cảm ơnLàm cách nào để tạo một hàm có trình xử lý hoàn thành trong Swift?

+2

Có một video tuyệt vời trên Youtube: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source= web & cd = 4 & ved = 0ahUKEwic45WLpN7MAhXJ1CYKHUzKDb8QtwIIMDAD & url = https% 3A% 2F% 2Fwww.youtube.com% 2Fwatch% 3Fv% 3DeoP6yYnlI9Y & USG = AFQjCNFjK7cX7BMh7AkeSrIkaAdAGvjatg & sig2 = 0zbt0TJOzM0GcXYZ6Xv2OA & BVM = bv.122129774, d.eWE & cad = rjt –

Trả lời

110

Giả sử bạn có chức năng tải xuống để tải xuống tệp từ mạng và muốn được thông báo khi tác vụ tải xuống hoàn tất.

typealias CompletionHandler = (success:Bool) -> Void 

func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) { 

    // download code. 

    let flag = true // true if download succeed,false otherwise 

    completionHandler(success: flag) 
} 

// How to use it. 

downloadFileFromURL(NSURL(string: "url_str")!, { (success) -> Void in 

    // When download completes,control flow goes here. 
    if success { 
     // download success 
    } else { 
     // download fail 
    } 
}) 

Hy vọng điều đó sẽ hữu ích. : -]

+2

này sẽ làm việc tuyệt vời, nhưng nhiều vì tò mò, tôi đã tự hỏi nếu bạn bằng cách nào đó có thể viết một bộ xử lý hoàn thành vào chức năng của bạn. – traw1233

+0

Hi Floks, Tôi muốn gọi CompletionHandler này từ chức năng khác để làm thế nào để đạt được điều này? –

1

Tôi hơi bối rối về trình xử lý hoàn thành tùy chỉnh. Trong ví dụ của bạn:

Giả sử bạn có chức năng tải xuống để tải xuống tệp từ mạng và muốn được thông báo khi tác vụ tải xuống hoàn tất.

typealias CompletionHandler = (success:Bool) -> Void 

func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) { 

    // download code. 

    let flag = true // true if download succeed,false otherwise 

    completionHandler(success: flag) 
} 

// download code của bạn sẽ vẫn chạy không đồng bộ. Tại sao mã không chuyển thẳng đến số let flag = truecompletion Handler(success: flag) của bạn mà không cần đợi mã tải xuống của bạn hoàn tất?

+0

Cuối cùng, một cái gì đó phải ngồi và đợi mã để chạy, nó không phải là một tháp khổng lồ của những con voi không đồng bộ tất cả các con đường xuống. "Ran không đồng bộ" có nghĩa là có hai luồng. Một trong số họ ngồi và đợi nhiệm vụ được thực hiện, người kia tiếp tục và không. Trình xử lý hoàn thành được gọi, hoặc ít nhất là được lên lịch để được gọi, ở cuối luồng làm công việc. –

9

Chúng ta có thể sử dụng đóng cửa cho mục đích này. Hãy thử như sau

func loadHealthCareList(completionClosure: (indexes: NSMutableArray)->()) { 
     //some code here 
     completionClosure(indexes: list) 
} 

Tại một thời điểm nào đó, chúng tôi có thể gọi hàm này như được nêu bên dưới.

healthIndexManager.loadHealthCareList { (indexes) ->() in 
      print(indexes) 
} 

Vui lòng tham khảo liên kết sau để biết thêm thông tin về Đóng cửa.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

0

Ngoài trên: Trailing đóng cửa có thể được sử dụng.

downloadFileFromURL(NSURL(string: "url_str")!) { (success) -> Void in 

    // When download completes,control flow goes here. 
    if success { 
     // download success 
    } else { 
    // download fail 
    } 
} 
31

Tôi đã gặp khó khăn khi hiểu câu trả lời vì vậy tôi giả sử bất kỳ người mới bắt đầu nào khác giống như bản thân tôi cũng có cùng vấn đề với tôi.

Giải pháp của tôi cũng giống như câu trả lời hàng đầu nhưng hy vọng một chút rõ ràng hơn và dễ hiểu đối với người mới bắt đầu hoặc mọi người chỉ gặp khó khăn trong việc hiểu nói chung.

Để tạo một hàm với một handler hoàn

func yourFunctionName(finished:() -> Void) { 

    print("Doing something!") 

    finished() 

} 

để sử dụng chức năng

 override func viewDidLoad() { 

      yourFunctionName { 

      //do something here after running your function 
      print("Tada!!!!") 
      } 

    } 

đầu ra của bạn sẽ

Doing something 
Tada!!! 

Hope this helps!

+0

Cảm ơn bạn đã dành thời gian để cung cấp câu trả lời này. Tôi hiểu nó và có thể thực hiện thành công. – Jazzmine

28

Simple Swift 4.0 Ví dụ:

func method(arg: Bool, completion: (Bool) ->()) { 
    print("First line of code executed") 
    // do stuff here to determine what you want to "send back". 
    // we are just sending the Boolean value that was sent in "back" 
    completion(arg) 
} 

Làm thế nào để sử dụng nó:

method(arg: true, completion: { (success) -> Void in 
    print("Second line of code executed") 
    if success { // this will be equal to whatever value is set in this method call 
      print("true") 
    } else { 
     print("false") 
    } 
}) 
Các vấn đề liên quan