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?
Trả lời
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. : -]
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
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? –
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 = true
và completion 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?
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. –
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.
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
}
}
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!
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
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")
}
})
- 1. Trình xử lý hoàn thành trong Swift
- 2. Làm cách nào để xử lý một NSURLSessionTask đã hủy trong khối xử lý hoàn thành?
- 3. Làm cách nào để phát hành một đối tượng có trình xử lý hoàn thành khối trong ARC?
- 4. Giá trị trả lại từ trình xử lý hoàn thành - Swift
- 5. Xử lý sự kiện trong hàm xử lý hoạt động khác với trình xử lý sự kiện ngoài hàm tạo
- 6. Đặt Trình xử lý tác vụ lập trình trong Swift
- 7. Trình xử lý hoàn thành và giá trị trả về
- 8. Tôi làm cách nào để tạo trình quản lý xử lý trong Rust?
- 9. Cách tạo một trình xử lý hình ảnh trong NancyFx
- 10. Làm cách nào để xử lý các ngoại lệ trong một hàm tạo bộ điều khiển trong WebAPI?
- 11. Làm thế nào để xử lý con trỏ 'này' trong hàm tạo?
- 12. Khối hoàn thành Swift
- 13. Làm thế nào để xử lý lambdas trong một trình biên dịch trước lambda
- 14. Trình xử lý hoàn thành trông như thế nào trong C# khi cố gắng tạo hiệu ứng động?
- 15. Có cần thử nghiệm BOOL trong trình xử lý hoàn thành cho hoạt ảnh UIView không?
- 16. Xử lý ảnh Swift
- 17. Làm cách nào để tạo trình xử lý hoàn thành của riêng tôi như một phần của các tham số phương thức
- 18. Làm thế nào tôi có thể hủy đăng ký một trình xử lý được đặt thành hàm jQuery.ajaxStart()?
- 19. Cách gọi hàm completionHandler để thực hiệnFetchWithCompletionHandler trong Swift
- 20. chủ đề nào mà trình xử lý sự kiện hoàn thành chạy trên?
- 21. gọi lại để xử lý hoàn thành đường ống
- 22. Có thể gọi trình xử lý hoàn thành khối từ một chức năng khác trong iOS không?
- 23. Lỗi không xử lý/Xử lý ngoại lệ trong Swift
- 24. MATLAB- chuyển một tham số xử lý chức năng vào một hàm khác làm xử lý
- 25. Tôi làm cách nào để tạo bộ xử lý chú thích xử lý Biến cục bộ?
- 26. Làm cách nào để xử lý các sự kiện miền được xử lý bởi trình xử lý sự kiện?
- 27. Trình xử lý hoàn thành gây EXC_BAD_ACCESS khi cùng một phương thức được gọi hai lần
- 28. UIView.animate - Swift 3 - hoàn thành
- 29. Cách tốt nhất để tạo quy trình con trong linux và xử lý lỗi có thể
- 30. Làm cách nào để loại bỏ trình xử lý sự kiện một cách an toàn?
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 –