Getting Started with PromiseKit in iOS
Introduction Là một programmer chắc chắn các bạn không xa lại gì với khái niệm Asynchronous . Đây luôn là vấn đề đau đầu với mỗi lập trình viên vì bạn cần phải xử lý một cách cực kì cẩn thận nếu không muốn chương trình của mình nằm ngoài tầm kiểm soát với completion handler . Hơn nữa việc debug ...
Introduction
Là một programmer chắc chắn các bạn không xa lại gì với khái niệm Asynchronous . Đây luôn là vấn đề đau đầu với mỗi lập trình viên vì bạn cần phải xử lý một cách cực kì cẩn thận nếu không muốn chương trình của mình nằm ngoài tầm kiểm soát với completion handler . Hơn nữa việc debug khá khó khăn khi bạn phải nắm được luồng xử lý. Vì thế chúng ta có khái niệm Promises . Promises cho phép bạn xử lý Asynchronous bằng các viết các đoạn mã theo một loạt các hành động sẽ diễn ra dựa trên các sự kiện biết trước.
Trong iOS chúng ta sẽ phải xử lý rất nhiều delegates và callbacks
- Y manages X. - Tell Y to get X. - Y notifies its delegate when X is available.
Promises sẽ đơn giản hoá nó
When X is available, do Y.
PromiseKit && Callback Hell
Mình có 1 yêu cầu đơn giản đó là :
- Gọi API để lấy về 1 random GIF url
- Sau đó gọi API download GIF image và thể hiện lên UIImageView
Để giải quyết yêu cầu này, chúng ta sẽ viết như sau :
SynapseAPI.fetchRandomGifUrl(forSearchQuery: "Dota2") { imageUrlString, error in if error { print(error.localizedDescription) throw error } self.fetchImage(forImageUrl: imageUrlString) { imageData, error in if error { print(error.localizedDescription) throw error } self.attachImage(withImageData: imageData) } }
Các bạn có thể thấy đầu tiên chúng ta cần phải gọi fetchRandomGifUrl . Xử lý dữ liệu trả về trong callback là thành công hay lỗi, nếu thành công thì sẽ gọi tiếp fetchImage . Tiếp tục xử lý dự liệu trả về trong callback của hàm này.
Cùng một công việc cần làm như vậy, các bạn hãy xem nếu sử dụng PromiseKit như thế nào nhé.
PromiseKitHelper.fetchRandomGifUrl(forSearchQuery: "Dota2") .then { imageUrlString in self.fetchImage(forImageUrl: imageUrlString) }.then { imageData in self.attachImage(withImageData: imageData) }.catch { error in print(error) }
Bạn sẽ thích viết như thế nào hơn? Callback hay Promises ? Có thể thấy cùng sử dụng 2 hàm để thực hiện 2 công việc nhưng PromiseKit trả về Promises thay vì bắt các sự kiện Callback. Sử dụng .then() để chờ đợi request thực hiện xong trước khi chuyển qua công việc tiếp theo. Và sử dụng .catch() để bắt tất cả lỗi nếu xảy ra. Không còn phải sử dụng lặp lại if,else để bắt lỗi nữa.
How to use PromiseKit
Trước hết để sử dụng PromiseKit bạn phải install third party này từ github về project của bạn đã