Skip to main content

Posts

Showing posts from March, 2020

Swift GCD part 1: Thread safe singletons

Preview Singletons are entities, referenced to the same instance of a class from everywhere in your code. It doesn't matter if you like them or not, you will definitely meet them, so it's better to understand how they work. Constructing and handling a set of data doesn't seem to be a big challenge at first glance. The problems appear when you try to optimise the user experience with background work and your app starts acting weird. ??‍♂️ After decades of watching your display mostly with a blank face, you finally realize that your data isn't handled consistently by the manager because you're accessing it (running tasks on it) from multiple threads at the same time. So you really do have to deal with making your singletons thread safe. This article series is dedicated to thread handling using Swift. In the first part below you will get a comprehensive insight into som

Property observers: didSet và willSet trong Swift

Property observers: didSet và willSet trong Swift Chúng ta đã biết là trong Swift đã có tính năng getter, setter với keyword là get, set cho thuộc tính. Ngoài ra, Swift còn có thêm tính năng là Property Observers. Tiếng Việt là dịch ra là quan sát/theo dõi thuộc tính. Cái tên đã nói nên tính cách rồi, Property Observers tức là theo dõi sự thay đổi của thuộc tính, nhất cử nhất động của thuộc tính ta đều biết. Trong quyển Start with Why ?, điều quan trọng nhất không phải là biết cách làm mà quan trọng nhất là tại sao phải làm? Vậy tại, why, vì lý do gì mà phải sử dụng willSet, didSet?. Dưới đây là những lý do mình thấy hay sử dụng didSet, willSet nhất: Cập nhật lại UI khi data thay đổi, tiết kiệm vài dòng code. Áp dụng để xây dựng các kiến trúc phần mềm, chẳng hạn như mô hình MVVM. Sơ qua MVVM là do Microsoft sáng tạo ra, nó dựa vào cơ chế data binding 2 chiều. Mà bên Swift không có nên đã chế ra  Key-Value-Observing.  Và didSet, willSet sẽ giúp thực hiện điều này Xây d

Swift Tool Belt, Part 1: Adding a Border, Corner Radius, and Shadow to a UIView with Interface Builder

During my iOS work, I’ve assembled a set of code that I bring with me on every iOS project. I’m not talking about large frameworks or CocoaPods here. These are smaller Swift extensions or control overrides that are applicable to many projects. I think of them as my tool belt. In this post, I’ll show you an extension that will add a border, a corner radius, and a shadow to any UIView, UIButton, or UILabel and allow you to preview what it will look like in Interface Builder. Back in 2014, I wrote a blog post on Expanding User-Defined Runtime Attributes in Xcode where I added a border, corner radius, and shadow to a UIView using Interface Builder’s user-defined runtime attributes. This solution had no type checking—you had to type the property you wanted to modify by hand and often had to look up what it was called. You also had to run your project in order to see the effect of the runtime attribute. Starting with Xcode 6 , there is a new mech

Dùng thư viện RXSWIFT để cải tiến hiệu suất cho dự án iOS của bạn

RxSwift Observable : - Là một sequence , nó bắn các event qua các khoảng thời gian khác nhau. Event có thể chứa value Int ,String , Custom type hay là một gesture, 1 tap khi nhấn button. - Life cycle của nó như sau : khi emit 1 event đó là next , Khi complete or error là kết thúc 1 stream. Obserable Cycle - Observable vs observer // OBSERVABLE // let observable = Observable<String>.create { (observer) -> Disposable in DispatchQueue.global(qos: .default).async { Thread.sleep(forTimeInterval: 10) observer.onNext("Hello dummy 🐣") observer.onCompleted() } return Disposables.create() } // OBSERVER // observable.subscribe(onNext: { (element) in print(element) }).addDisposableTo(disposeBag) Ví dụ trên bạn có thể thấy observable là cái sẽ emit ra event, còn observer là cái nhận event. - Tạo một observable // ========1.Tạo từ những giá trị cho trước======= // Observable.of(1,

RxSwift: Các loại Subject trong RxSwift

1. Khái niệm: Subject trong RxSwift hoạt động như vừa là một Observable , vừa là một Observer . Khi một Subject nhận một .next event thì ngay lập tức nó sẽ phát ra các emit cho các subscriber của nó. 2. Khái quát: Trong RxSwift, chúng ta có 4 loại Subject với các cách thức hoạt động khác nhau, bao gồm: PublishSubject : Khởi đầu "empty" và chỉ emit các element mới cho subscriber của nó. BehaviorSubject : Khởi đầu với một giá trí khởi tạo và sẽ relay lại element cuối cùng của chuỗi cho Subscriber mới. ReplaySubject : Khởi tạo với một kích thước bộ đệm cố định, sau đó sẽ lưu trữ các element gần nhất vào bộ đệm này và relay lại các element chứa trong bộ đệm cho một Subscriber mới. Variable : Lưu trữ một giá trị như một state và sẽ relay duy nhất giá trị cuối cùng cho Subscriber mới. 3. Chi tiết: 3.1. PublishSubject: Publish subjects được sử dụng khi bạn chỉ muốn subscribers được thông báo về các sự kiện mới từ thời điểm bạn subscribe cho đến khi hủy subs

RxSwift: Các cách khởi tạo Observable trong RxSwift

Lời mở đầu: RxSwift là một Extension của ReactiveX được viết bằng ngôn ngữ Swift. Nó là sự kết hợp của Observer Pattern, Iterator Pattern và Functional Programing. RxSwift giúp cho công việc trở nên đơn giản hơn. RxSwift giúp tối giản và hạn chế việc sử dụng các Notifications và Delegate Pattern đi kèm với các câu lệnh if/else và các block code lồng nhau phức tạp trong code. Trong bài viết này, mình sẽ giới thiệu với các bạn về những cách để tạo ra một Observable trong RxSwift. .just( ): .just( ) là một phương thức trong RxSwift, nó giúp tạo ra một Observable chỉ với duy nhất một element. Ngay khi được gọi, Observable.just( ) sẽ emit ra một element duy nhất và sau đó sẽ terminate. let disposeBag = DisposeBag ( ) let observable = Observable . just ( "this is element" ) observable . subscribe { element in print ( element ) } . disposed ( by : disposeBag ) Kết quả: next(this is element)