Skip to main content

Posts

Showing posts from February, 2020

Different between Map and FlatMap in RX

In short, the map applies a function to each emitted element and returns its result. Observable<Integer> observable = Observable . just (1,2,3) .map(x -> 10 * x); observable.subscribe(System. out ::println); Result: 10 20 30 So FlatMap applies a function to each emitted element, but this function returns the type of the Observable. I.e. 1 emitted by an element through a flatMap to generate a set of emitted elements or not one. Observable<String> observable = Observable . just ( "A" , "B" , "C" ) .flatMap(s -> { System. out .println(); return Observable. just (s + "1" , s + "2" , s + "3" ); }); observable.subscribe(s -> System. out .print(s + " " )); Result: A1 A2 A3 B1 B2 B3 C1 C2 C3

Top các thư viện open source tốt nhất được viết bằng Swift cho iOS

Top các thư viện open source tốt nhất được viết bằng Swift cho iOS Library Swift iOS open source I. Giới thiệu Các framework, library đã trở thành một phần không thể thiếu trong quá trình viết code của giới lập trình viên. Càng ngày, chúng ta lại có thêm càng nhiều thư viện mới tốt hơn, giúp ích cho chúng ta nhiều hơn trong công việc. Dưới đây, tôi xin giới thiệu các thư viện tốt nhất cho iOS, mỗi thư viện phục vụ một mục đích khác nhau, để các bạn có thể tham khảo và sử dụng trong project. II. Nội dung 1. Các thư viện về network a. Alamofire Alamofire là thư viện giúp chúng ta làm việc với các request http. Chắc hẳn mọi người đều sử dụng thư viện này. Nó là thư viện quốc dân, gần như tất cả project iOS có sử dụng request network đều sử dụng Alamofire cả (project Objective-C thì sử dụng AFNetworking). Các bạn có thể tìm hiểu thêm về Alamofire tại đây b. Kingfisher Kingfisher là thư viện rất mạnh mẽ giúp

Enum Initializers

In Swift Talk 45 , we wrote a small library for parsing routes. We represented routes as enums, and added a custom initializer to parse routes: enum Route { case home case users(id: Int ) } extension Route { init ?(path: String ) { if path == "/" { self = .home } else if path.hasPrefix( "/users" ) { self = .users(id: 1 ) } else { return nil } } } Of course, this code isn’t complete (see the full public episode for that). Today, we want to focus on assigning to self inside the initializer. In the initializer of any struct or enum we can treat self as a mutable variable (as if it were declared using inout ). This is why we can do the following: enum Result < A > { case success( A ) case error( Error ) } extension Result { init ( _ value: A ) { self = .success(value) } } We can even do this in a struct, although it’s easie

Realm Mobile Database

I. Realm là gì? Ngày nay, việc phát triển ứng dụng di động đang trở thành xu hướng và phổ biến khắp mọi nơi. Trong mỗi ứng dụng thì phần quan trọng không kém chính là Cơ sở dữ liệu. CSDL phổ biến nhất được sử dụng hiện nay trên hầu hết các thiết bị là SQLite bởi vì nó khá quen thuộc với đại đa số các lập trình viên do sử dụng câu truy vấn SQL. Tuy nhiên, SQLite cũng có những mặt hạn chế nhất định như tốc độ truy vấn khá chậm khi mà dữ liệu phình to ra cũng như khi mà thực hiện phép JOIN. Trên cơ sở đó, Realm Mobible Database ra đời với mục đích cung cấp cho lập trình viên một lựa chọn có thể thay thế cho SQLite hiện nay nhưng vẫn đảm bảo mọi chức năng cần thiết của một CSDL thông thường: Realm Moblie Database ( gọi tắt là RMD) là một NoSQL ( Not Only SQL). Nó hướng tới việc xây dựng một ứng dụng theo hướng Offline database first. Điều này có nghĩa là ứng dụng vẫn có thể hoạt động dù cho không có kết nối mạng, dữ liệu sẽ được lưu trực tiếp trên thiết bị, người dùng vẫ

Một số Tip để tăng skill cho iOS developer

Giới thiệu Xin chào tất cả mọi người Swift là ngôn ngữ lập trình mới được phát triển bởi Apple Inc với mục đích hỗ trợ lập trình viên trong việc phát triển các ứng dụng chạy trên các hệ điều hành như iOS, OSX và watchOS. Swift được xây dựng dựa trên việc kế thừa các tính năng của 2 ngôn ngữ C và Objective-C. Hôm nay mình xin phép chia sẻ một số Tip để có thể tăng skill code iOS-Swift. Bắt đầu Subscripts: Class, struct và enum có thể define subscript. Subscripts dùng để truy cập nhanh các phần tử của collection,list hay sequence.Bạn có thể sử dụng subscripts để set và truy xuất dữ liệu với index luôn mà không cần phải gián tiếp qua phương thức khác. Ví dụ bạn truy cập các phần tử trong Array thông qua someArray[index] Sau đây là 2 ví dụ để mô tả dùng subscript để có thể rút gọn clear hơn: Không sử dụng subscripts: struct Matrix { let rows: Int, columns: Int var grid: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns

Combo các lệnh git đủ dùng trong một dự án của công ty cho người mới bắt đầu.

Nếu bạn không muốn dùng tool được tích hợp sẵn trong Xcode(Xcode -> Source Control -> Commit, Push, Pull,...) hoặc các phần mềm quản lý source riêng biệt như Source Tree,... thì bạn cũng có thể sử dụng các command trong Terminal để quản lý source của project. Dưới đây là một danh sách các lệnh git được sắp xếp có thứ tự trong một project thực tế. Fork, Clone Mở website của github , tìm đến project, và nhấn nút Fork ở phía trên bên phải của website để tạo 1 sub-project của project cha, nó là project mới trong git hub cá nhân mình Sau đó, trở lại website project cha, nhấn nút "Clone or download" để lấy code xuống máy, có 2 cách clone là "HTTPS" và "SSH" "HTTPS" thì sử dụng web url "SSH" thì nó sử dụng SSH key và passphrase của tài khoản của mình, và mỗi lần tương tác với project cha thì buộc phải nhập passphrase, vì vậy, khi cấu hình SSH thì các bạn nên đặt passphrase cho dễ nhớ, và ngắn gọn, đơn giản thôi. Vì

Swift: Closure và những thuật ngữ liên quan

Ở bài viết lần này mình sẽ cùng các bạn đi ôn lại về một kiến thức rất nền tảng và khá là đặc biệt của Swift, đó chính là Closure. Đầu tiên, hãy đi đến định nghĩa của nó trước nhé. Định nghĩa " Closure là một khối chức năng độc lập có thể truyền đi và được sử dụng trong code của bạn." Nghe vẫn khá là mơ hồ nhỉ? Closure trong Swift khá là giống blocks trong C hay Objective-C , là một đoạn mã được bao hàm trong block thực hiện một chức năng cụ thể nào đó như là Function vậy. Nói đến Function thì nó có tên (để gọi), có kiểu trả về (hoặc không với Void) và đoạn mã trong block để thực hiện chức năng, vậy Function có phải là Closure không? Câu trả lời là có với Global hay Nested function thực chất là trường hợp đặc biệt của closure. Closure sẽ thuộc một trong 3 dạng dưới đây: Global function là một closure có tên và không capturing value Nested function là một closure có tên và có khả năng capturing value từ function bao quanh chúng Closure expression là một

Tìm hiểu về CALayer trong iOS

Như bạn đã biết, mọi thứ mà bạn nhìn thấy trong ứng dụng iOS là một view. Nó có thể là button view, table view, slide view, và thậm chí là parent view (chứa nhiều view con khác). Tuy nhiên bạn có thể không biết rằng mỗi view trong iOS lại dựa trên một lớp khác gọi là layer - cụ thể là CALayer. Trong bài viết này bạn sẽ biết về CALayer và cách thức mà CALayer hoạt động. Bạn cũng có thể tìm thấy các ví dụ về cách sử dụng cơ bản CALayer. CALayer liên quan tới UIView như thế nào? UIView quản lý rất nhiều thứ bao gồm layout hoặc xử lí các touch event. Điều thú vị là nó không hề quản lý trực tiếp các drawing hay aminations mà CoreAnimation sẽ đảm nhận nhiệm vụ này. Thực tế UIView chỉ bao bọc bên ngoài CALayer. Khi set bound trên một UIView thì view sẽ set bound cho CALayer của nó. Nếu ta gọi layoutIfNeeded trong UIView, lệnh gọi sẽ được truyền tới root CALayer. Mỗi UIView có một root CALayer, mỗi root CALayer có thể chứa nhiều layer con. Để tìm hiểu về CALayer chúng ta hãy

Tạo placeholder loading animation giống Facebook, Youtube (Phần 2)

Introduction https://viblo.asia/p/tao-placeholder-loading-animation-giong-facebook-youtube-phan-1-RQqKLv8ml7z Ở bài viết lần trước , chúng ta đã tìm hiểu cơ bản về CAGradientLayer , CABasicAnimation để tạo placeholder có loading animation giống app Facebook iOS, Youtube iOS. Cụ thể là ta đã tạo được hiệu ứng lướt từ trái sang phải cho một single view. Trong bài này, hãy cùng nhau hoàn thiện nó và đóng gói để dễ dàng tái sử dụng animation này nhé. Make placeholder loading animation (continue) Apply animation to table view Đầu tiên, refactor code animate ở bài trước thành extension của UIView , UIColor như sau: extension UIColor { class func backgroundGray ( ) - > UIColor { return UIColor ( red : 246.0 / 255 , green : 247 / 255 , blue : 248 / 255 , alpha : 1 ) } class func lightGray ( ) - > UIColor { return UIColor ( red : 238.0 / 255 , green : 238 / 255 , blue : 238 / 255 , alpha : 1

Lazy var trong Swift

Xin chào, lại là mềnh đây. T_T hôm nay lại là một bài dịch mà mềnh học được trong lúc ngồi viết báo cáo thực tập. Mình nghĩ bài viết này sẽ khá hay cho các fresher như mình để hiểu sâu hơn về Swift và iOS. Rất mong các bạn ủng hộ. Lazy var trong swift Trong quá trình phát triển các sản phẩm iOS, chắc chắn rằng các developer luôn để ý tới việc số lượng bộ nhớ (amount of memory) mà app của chúng ta sử dụng. Nếu app của chúng ta quá phức tạp thì vấn đề về bộ nhớ là một trong những thách thức khó nhằn với các dev. Chính vì lẽ đó, các dev chúng ta phải rất cẩn thận với từng dòng code của mình và đương nhiên đặt ưu tiên hàng đâu cho việc tối ưu hoá cấp phát bộ nhớ. Chúng ta nên tránh việc khởi tạo hay làm gì đó vô tội vạ trừ khi điều đó rất là cần thiết, bởi đơn giản, những điều nó có thể gây khó khăn cho chúng ta về sau này trong việc fix bug hay thậm chí là gây ảnh hưởng tới performance của app. Trong Swift có một kỹ thuật gọi là lazy giúp cho bạn trì hoãn việc khởi

Tích hợp Stripe phục vụ thanh toán trực tuyến trong ứng dụng IOS

Tích hợp Stripe phục vụ thanh toán trực tuyến trong ứng dụng IOS Stripe là gi ? Nếu có dự định bán sản phẩm trong ứng dụng iOS và tìm kiếm giải pháp thanh toán thì có lẽ Stripe sẽ là lựa chọn hàng đầu của các lập trình viên hiện nay. Stripe là nền tảng phần mềm tốt nhất cho hoạt động kinh doanh trên internet. Stripe hiện đang thực hiện xử lý hàng tỷ đô la mỗi năm cho các doanh nghiệp trên khắp thế giới. Stripe cung cấp một trong những thư viện mạnh mẽ nhất để cho phép thanh toán trực tuyến trên các ứng dụng dành cho thiết bị di động. Tripe được xây dựng cho các nhà phát triển. Nó cung cấp Stripe API để có thể được sử dụng bởi rất nhiều các ngôn ngữ như: Ruby, Python, Java, GO.. Bạn sẽ không phải lo lắng về việc mở tài khoản người bán hoặc thiết lập cổng tín dụng. Với Stripe, bạn có thể dễ dàng kích hoạt ứng dụng của mình để nhận thanh toán từ thẻ tín dụng và thậm chí thực hiện thanh toán định kỳ. ở bài viết này chúng ta sẽ đi sâu vào cách sử dụng stripe phục vụ cho