Skip to main content

Posts

Phần bổ sung - Bài 1: Hot và Cold Observables

 Đây là loạt bài song song với loạt bài chính. Mục đích của phần này là viết những bài bổ sung thêm kiến thức mà không làm ảnh hưởng đến trục chính mình đang viết bên RxSwift kia. 1. Hot and Cold Observables “hot” Observable có thể bắt đầu phát ra events ngay khi nó được tạo ra và những observer mà bắt đầu subscribes có thể sẽ observer ở đâu đó đoạn giữa giữa tín hiệu. "hot" không cần subscribes vẫn phát được tín hiệu. “cold” Observable thì lại chờ đến khi có ai đó lắng nghe mới phát tín hiệu, nên người quan sát có thể yên tâm rằng mình có thể thấy toàn bộ sequence từ lúc bắt đầu. "cold" cần subscribe mới chịu phát tín hiệu. 2. Dấu hiệu nhận biết "hot" Observable là những thứ như UIButton.rx.tap , UITextField.rx.text mà có thể phát ra events kiểu Void khi 1 button đc tap hay kiểu String khi text field được nhập. "cold" Observable là những thứ mà ta thường bỏ vào hàm Observable.create() 3. Thực tế mình gặp phải Trước khi mình b
Recent posts

Phân biệt các hàm xử lí Collection trong Swift. (Map, FlatMap, Filter, CompactMap..)

Giới thiệu Đối với lập trình viên, việc thao tác với collection là kĩ nẵng quan trọng. Trong bài viết này tôi sẽ trình bày về chức năng của các hàm xử lí với Collection trong Swift (Filter, Map, FlatMap, CompactMap, Reduce) Filter(): Filter là một trong những hàm khá thông dụng trong Swift. Chức năng của filter là duyệt các phần tử trong mảng và trả về 1 mảng chua các phần tử thỏa mãn điều kiện cho trước. func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element] Quan sát closure isInclude (self.Element) -> Bool là tham số tuyền vào, có chức năng kiểm kiểm tra phan tử có thõa mãn điều kiện để thêm lọc mảng. Nếu closure return true phần tử sẽ được thêm vào mảng và ngược lại. Ví dụ: Tìm các phần tử chia hết cho 2 trong mảng số nguyên. Khi không sử sự Filter: Ví dụ với Filter: Rút gọn: Map(): Map là hàm có chức năng duyệt các phần tử t

Universal link trên iOS

Việc hỗ trợ universal link cho phép một website chia sẻ nội dung, kết nối tới một ứng dụng iOS. Có nghĩa khi người dùng kích vào đường link HTTP trên điện thoại iPhone, nó dẫn tới một ứng dụng iOS thay vì sử dụng trình duyệt safari, còn nếu không có ứng dụng iOS nào hỗ trợ universal link, đường link sẽ được hiển thị trên trình duyệt. Việc sử dụng  universal link  sẽ mang tới một số lợi ích sau: Tính đơn nhất ( Unique ): không giống như URL schema (deep link), universal link không thể được sử dụng bởi các ứng dụng khác Tính bảo mật ( Secure ): khi người dùng cài đặt ứng dụng, iOS sẽ kiểm tra file  apple-app-site-association  trên server để đảm bảo rằng ứng dụng đang cài đặt trên máy được phép mở URL đã truy cập. Tính linh hoạt ( Flexible ): Universal link hoạt động ngay cả khi ứng dụng iOS chưa được cài đặt, vì khi chưa được cài đặt, URL sẽ được mở qua trình duyệt. Đơn giản ( Simple ): URL có thể dụng cho cả website và ứng dụng iOS Cần thực hiện những bước sau để sử dụng univ

iOS > Android: View Life Cycle

Here’s a quick comparison of the most common lifecycle methods on the two platforms, and where they fit into the life cycle of the view.

MVVM và VIPER: Con đường trở thành Senior

Trong bài viết trước chúng ta đã tìm hiểu về MVC và MVP để ứng dụng cho một iOS App đơn giản. Bài này chúng ta sẽ tiếp tục ứng dụng 2 mô hình MVVM và VIPER . Nhắc lại là ứng dụng của chúng ta cụ thể khi chạy sẽ như sau: Source code đầy đủ cho tất cả mô hình MVC, MVP, MVVM và VIPER các bạn có thể download tại đây . MVVM MVVM có thể nói là mô hình kiến trúc được rất nhiều các cư dân trong cộng đồng ưa chuộng. Điểm tinh hoa của kiến trúc này là ở ViewModel , mặc dù rất giống với Presenter trong MVP tuy nhiên có 2 điều làm nên tên tuổi của kiến trúc này đó là: ViewModel không hề biết gì về View , một ViewModel có thể được sử dụng cho nhiều View (one-to-many). ViewModel sử dụng Observer design pattern để liên lạc với View (thường được gọi là binding data , có thể là 1 chiều hoặc 2 chiều tùy nhu cầu ứng dụng). Chính đặc điểm này MVVM thường được phối hợp với các thư viện hỗ trợ Reactive Programming hay Event/Data Stream , đây là triết lý lập trình hiện đại và hiệu

MVC, MVP, MVVM, VIPER nên xài cái nào (P1)

Xin chào các công dân mới toanh vừa gia nhập thế giới kiến trúc ứng dụng. Tính bài trước, các bạn đã là bước chân vào thế giới này rồi. Hôm nay với vai trò là một công dân "già", mình sẽ giới thiệu các bạn đến một số "địa điểm" nổi tiếng nhất của thế giới này: MVC : V iew - C ontroller - M odel MVP : V iew - P resenter - M odel MVVM : V iew - V iew M odel - M odel VIPER : V iew - P resenter (with R outer/Wireframe) - I nteractor - E ntity (Model) Trong các mô hình trên mình cố tình ghi các thành phần theo đúng với mối liên hệ của chúng để các bạn dễ hình dung. Nhưng các bạn có thấy điểm chung nào giữa chúng không ? Điểm chung đó chính là View và Model luôn ở đầu và cuối và có xu hướng rời xa nhau. Mối liên kết giữa View - Model trong kiến trúc ứng dụng Ta đang nói về kiến trúc ứng dụng, nghĩa là thiết kế kiến trúc cho ứng dụng. Ứng dụng thì sẽ luôn có giao diện người dùng ( graphic user interface - GUI ) và phần code cũng như dữ liệu ( data - mod

Thread safe singleton’s in Swift

What are singletons? — Singleton is design patterns which says that there should be only one instance of the class for the lifetime of the application. One the best example of Singleton is AppDelegate . How to write a singleton class ? class DefaultDict{ private var dict:[String:Any] = [:] public static let sharedManager = DefaultDict() private init(){ } public func set(value:Any,key:String){ dict[key] = value } public func object(key:String) -> Any?{ dict[key] } public func reset(){ dict.removeAll() } }   Testing singleton class under concurrent circumstances. We are going to write an example where we will set values in dict from various threads and even try to access some with different threads. When we do this we will encounter a crash. If you look closely it will be because of race condition and the crash will be on line set(value:Any,key:String) . class ViewController: UIViewController { ov