Completion Handler với Objective C và Swift
Ứng dụng di động có nhiều tác vụ phải xử lý bất đồng bộ để giúp Main Thread không bị tắc nghẽn (tác vụ chạy lâu cản trở luồng thực thi chính, khiến khả năng phản hồi tương tác của người dùng và cập nhật giao diện bị cản trở, ứng dụng sẽ chạy không được mượt mà). Trước đây, người ta ...
Ứng dụng di động có nhiều tác vụ phải xử lý bất đồng bộ để giúp Main Thread không bị tắc nghẽn (tác vụ chạy lâu cản trở luồng thực thi chính, khiến khả năng phản hồi tương tác của người dùng và cập nhật giao diện bị cản trở, ứng dụng sẽ chạy không được mượt mà).
Trước đây, người ta phải sử dụng rất nhiều phương thức delegate để xử lý asynchronous, nhưng với sự cải tiến của Objective-C, nó cho phép chúng ta trả về giá trị đến block như 1 Completion Handler (hàm hứng sự kiện sau khi tác vụ bất đồng bộ trả về). Thậm chí, chúng ta cũng có thể làm điều tương tự như vậy trong Swift.
Dưới đây là 1 function được định nghĩa trong Objective-C để khai báo và sử dụng 1 Completion Handler:
Các bạn có thể sẽ cảm thấy khó khăn khi cố gắng khai báo 1 block trong Objective-C, tôi thậm chí còn chẳng thể nhớ nổi một trong số chúng. Nhưng đừng lo lắng, thế giới còn rất nhiều người tốt bụng, và 1 trong số họ đã viết lên trang Fucking Block Syntax để chúng ta có thể tìm đến mỗi khi cố gắng khai báo 1 block trong Objective-C.
Swift đem đến một số cải tiến tốt hơn, nó không đơn giản chỉ là ngôn ngữ đến sau, thậm chí, ý tưởng viết lên nó có thể đã được nung nấu từ rất lâu.
Trông thì có thể phức tạp (như tất cả khai báo function trong function), nhưng nó thực sự đơn giản. Chỉ là 1 function với 1 tham số truyền vào như là 1 function (function lồng trong function). Khi bạn đã hiểu sự lồng nhau này, nó sẽ nhanh chóng trở nên rõ ràng hơn:
Các bạn có thể gọi function truyền vào như 1 tham số bên trên là block, giống như block trong Objective-C hay một vài ngôn ngữ khác. Tuy nhiên, trong Swift, nó được biết đến với cái tên là Closure, trong trường hợp này nó là 1 Completion Closure, để đơn giản, các bạn hãy coi nó như là một function, cần 1 tham số truyền vào là 1 String, và trả về Void. Nghe có vẻ hơi ngược, tại sao nó lại cần truyền vào 1 tham số là String? Chúng ta muốn trả về 1 String, nhưng chúng ta lại không thực sự muốn trả về 1 String. Và lẽ ra, nó có thể bị blocked cho đến khi giá trị được trả về, tuy nhiên, thay vào đó, chúng ta gọi 1 function và truyền vào cho nó 1 tham số liên quan, trong trường hợp này là: completion(“We finished!”)
Sử dụng Completion Handler trong Swift đơn giản hơn việc khai báo nó, vì vậy, hãy dành 1 lời cảm ơn đến Swift Team, họ đã nỗ lực cải thiện để đem đến những thuận lợi nhất cho chúng ta:
Đoạn lệnh bên trên là phần sau của Closure, chúng ta có thể sử dụng, xử lý một vài thứ, hoặc thực hiện một vài hành động tại đây bất kể khi nào tham số cuối cùng truyền vào function là 1 Closure. Cú pháp {() in } có thể có một chút hơi xa lạ, tuy nhiên, tuyệt vời là chúng ta đã nhận được kết quả, thứ mà chúng ta truyền vào closure trong async function: completion(“We finished!”).
Techtalk via Techmaster