RxSwift 2: Khái niệm cơ bản về lập trình bất đồng bộ

Công Nghệ
RxSwift 2: Khái niệm cơ bản về lập trình bất đồng bộ
Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh Đồng bộ và bất đồng bộ khác nhau như nào? Ví dụ, khi các bạn tính 1+ 1 trên máy tính casio bỏ túi thì nó ra luôn là 2, vậy kết quả đó là tức thời thì nó là đồng bộ. Còn giả sử bạn nhập 1 + 1 trên 1 trang web, rồi bấm nút kết quả, trang đó sẽ gọi lên server xử lý được kết quả và trả về lại cho web là 2 để hiển thị cho bạn, thì như vậy bạn phải đợi trong 1 khoảng thời gian nào đó, giả sử bạn dùng mạng miền núi mất 2s mới trả về, thì đó gọi là bất đồng bộ. Nói nôm na, cái gì mà phải chờ đợi thì bất đồng bộ, còn cái gì tức thời thì đồng bộ. Xem thêm Việc làm swift hấp dẫn trên Station D RxSwift 10: Làm việc với PublishSubjects RxSwift 5: Cài đặt RxSwift Còn trong 1 chương trình IOS, chúng ta có thể có rất nhiều thứ bất đồng bộ, ví dụ 1 app như sau: Sự kiện khi bấm vào 1 nút(button) trên màn hình, ví dụ nút đăng nhập(chúng ta thực sự không biết lúc nào thì user bấm) Hiển thị bàn phím hay ẩn bàn phím trên 1 ô text filed Tải 1 file ảnh lớn từ internet(không biết bao lâu thì xong, tùy thuộc vào mạng nhà bạn) Lưu dữ liệu xuống đĩa Chơi 1 bài hát Và nhiều nữa… Và các sự kiện trên đều có thể xảy ra cùng 1 lúc, ví dụ bạn vừa nghe nhạc vừa tải 1 ảnh về, vừa mở ô text filed để nhập gì đó. Vậy chúng ta sẽ xử lý từng...

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Đồng bộ và bất đồng bộ khác nhau như nào? Ví dụ, khi các bạn tính 1+ 1 trên máy tính casio bỏ túi thì nó ra luôn là 2, vậy kết quả đó là tức thời thì nó là đồng bộ. Còn giả sử bạn nhập 1 + 1 trên 1 trang web, rồi bấm nút kết quả, trang đó sẽ gọi lên server xử lý được kết quả và trả về lại cho web là 2 để hiển thị cho bạn, thì như vậy bạn phải đợi trong 1 khoảng thời gian nào đó, giả sử bạn dùng mạng miền núi mất 2s mới trả về, thì đó gọi là bất đồng bộ. Nói nôm na, cái gì mà phải chờ đợi thì bất đồng bộ, còn cái gì tức thời thì đồng bộ.

Xem thêm Việc làm swift hấp dẫn trên Station D

Còn trong 1 chương trình IOS, chúng ta có thể có rất nhiều thứ bất đồng bộ, ví dụ 1 app như sau:

  • Sự kiện khi bấm vào 1 nút(button) trên màn hình, ví dụ nút đăng nhập(chúng ta thực sự không biết lúc nào thì user bấm)
  • Hiển thị bàn phím hay ẩn bàn phím trên 1 ô text filed
  • Tải 1 file ảnh lớn từ internet(không biết bao lâu thì xong, tùy thuộc vào mạng nhà bạn)
  • Lưu dữ liệu xuống đĩa
  • Chơi 1 bài hát
  • Và nhiều nữa…

Và các sự kiện trên đều có thể xảy ra cùng 1 lúc, ví dụ bạn vừa nghe nhạc vừa tải 1 ảnh về, vừa mở ô text filed để nhập gì đó. Vậy chúng ta sẽ xử lý từng sự kiện riêng biệt đó như thế nào?

RxSwift 2: Khái niệm cơ bản về lập trình bất đồng bộRxSwift 2: Khái niệm cơ bản về lập trình bất đồng bộ
Ứng dụng IOS làm những việc bất đồng bộ đồng thời

Tất cả các việc trên đều không ngăn chặn quá trình thực thi của nhau. IOS cung cấp các APIs để thực thi các việc khác nhau trên các luồng khác nhau(thread) trên các lõi khác nhau của CPU. Tuy nhiên việc viết mã song song khá phức tạp, đặc biệt các việc khác nhau lại cần nguồn dữ liệu giống nhau. Thật khó để xác định đoạn mã nào cập nhật dữ liệu trước hoặc đoạn mã nào có được dữ liệu mới nhất. (Ví dụ bạn không thể xác định được bao lâu thì ảnh mới tải xong, ảnh nào là tải xong đầu tiên…)

Cocoa và các API UIKit bất đồng bộ

Apple cung cấp rất nhiều API trong IOS SDK của họ để giúp bạn viết các đoạn mã bất đồng bộ. Bạn có thể đã sử dụng những thứ này tuy nhiên lại không biết mình đã từng sử dụng, cụ thể những thứ phổ biến mà bạn hay dùng như sau:

  • NotificationCenter: Để thực thi những đoạn code tại 1 thời điểm không biết trước nào đó, ví dụ khi người dùng cầm điện thoại để nó nằm ngang hay dọc, bàn phím ẩn hay hiện trên ứng dụng.
  • The delegate pattern: để thực thi các đoạn code được ủy quyền từ nơi khác, ví dụ bạn muốn xử lý khi có thông báo mới (push notification) đến ứng dụng.
  • Grand Central Dispatch: để giúp bạn thực thi các phần công việc. Bạn có thể viết mã để các công việc thực thi trong 1 hàng đợi nối tiếp hay chạy vô số tác vụ đồng thời trên nhiều hàng đợi khác nhau với sự ưu tiên khác nhau.
  • Closures: để tách các đoạn mã mà bạn có thể chuyển giữa các lớp, để mỗi lớp có thể quyết định thực thi nó hay không, bao nhiêu lần và khi nào

Vì đa số các lớp của bạn đều thực hiện những công việc không đồng bộ, các thành phần giao diện người dùng(UI) cũng hoạt động không đồng bộ, cho nên không thể xác định được mã của bạn sẽ thực thi theo thứ tự nào.

Tóm lại, ứng dụng của bạn hoạt động tùy thuộc vào điều kiện dữ liệu bên ngoài, như dữ liệu đầu vào người dùng, điều kiện mạng internet hay các sự kiện hệ điều hành khác. Mỗi khi người dùng mở ứng dụng của bạn, thì nó sẽ hoạt động khác nhau tùy thuộc vào các yếu tố bên ngoài đó. Chúng ta không hề nói rằng việc viết chương trình không đồng bộ là không thể, vì công bằng mà nói các API của apple là mạnh mẽ so với các nền tảng khác cung cấp.

Vấn đề là mã không đồng bộ trở nên phức tạp do sự đa dạng các API của apple cung cấp trong framework(SDK) của họ như sau:

RxSwift 2: Khái niệm cơ bản về lập trình bất đồng bộRxSwift 2: Khái niệm cơ bản về lập trình bất đồng bộ

Việc sử dụng delegate bạn cần áp dụng theo mẫu, hoặc có lúc bạn lại sử dụng closure thay thế, hoặc cũng có thể dùng notification center. Không có 1 quy tắc chung nào cho các API trên, do vậy việc đọc hiểu cũng như suy luận logic code trở nên khó khăn(thích cái gì thì dùng cái đó, không có nguyên tắc cho developer).

Để kết thúc phần này, chúng ta sẽ nghiên cứu 2 đoạn mã đồng bộ và bất đồng bộ sau:

Synchronous code(mã đồng bộ)

Để thực hiện thao tác cho 1 phần tử của 1 mảng thì bạn đã dùng rất nhiều lần. Đó là logic ứng dụng rất đơn giản và có 2 điều bất biến: 1 là các thành phần của mảng, và 2 là nó thực thi đồng bộ.

Hãy thử đoạn code sau trên playground(xcode):

var array = [1, 2, 3]
for number in array {
  print(number)
  array = [4, 5, 6]
}
print(array)

kết quả như sau:

1
2
3
[4, 5, 6]

Rõ ràng mặc dù có thay đổi giá trị của array trong vòng for, tuy nhiên kết quả array vẫn không thay đổi trong quá trình thực thi vòng for. Nó chỉ thực sự thay đổi khi thoát ra khỏi vòng for.

Asynchronous code(mã bất đồng bộ)

Hãy tải code ở link sau:

https://github.com/lexuanquynh/RxLearning.git

hoặc mở xcode và tạo 1 chương trình có dạng:

class ViewController: UIViewController {
    var array = [1, 2, 3]
    var currentIndex = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    @IBAction func onButtonTouched(_ sender: Any) {
        print(array[currentIndex])
        if currentIndex != array.count-1 {
            currentIndex += 1
        }
    }
}

Mỗi lần bấm vào nút button trên màn hình, thì index sẽ in ra và tăng lên 1 cho đến khi nó khác 3. Nếu bạn không thể hiểu đoạn code trên thì nên xem lại kiến thức căn bản về lập trình swift nhé.

Vấn đề là, giả sử có 1 đoạn code khác cũng sử dụng mảng array trên, và trong khi bạn còn chưa bấm nút để tăng index, thì array bị thay đổi giá trị hay index bị thay đổi giá trị, dẫn đến kết quả không còn là 1, 2, 3 nữa. Do vậy với đoạn code bất đồng bộ như vậy sẽ rất khó quản lý kết quả như mong muốn. May mắn thay, RxSwift lại giúp ta việc đó.

Vậy chúng ta hãy tiếp tục trong bài 3 để hiểu rõ hơn về nó nhé.

Bài viết gốc được đăng tải tại codetoanbug.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên Station D

Bài viết liên quan

Bộ cài đặt Laravel Installer đã hỗ trợ tích hợp Jetstream

Bộ cài đặt Laravel Installer đã hỗ trợ tích hợp Jetstream

Bài viết được sự cho phép của tác giả Chung Nguyễn Hôm nay, nhóm Laravel đã phát hành một phiên bản chính mới của “ laravel/installer ” bao gồm hỗ trợ khởi động nhanh các dự án Jetstream. Với phiên bản mới này khi bạn chạy laravel new project-name , bạn sẽ nhận được các tùy chọn Jetstream. Ví dụ: API Authentication trong Laravel-Vue SPA sử dụng Jwt-auth Cách sử dụng Laravel với Socket.IO laravel new foo --jet --dev Sau đó, nó sẽ hỏi bạn thích stack Jetstream nào hơn: Which Jetstream stack do you prefer? [0] Livewire [1] inertia > livewire Will your application use teams? (yes/no) [no]: ... Nếu bạn đã cài bộ Laravel Installer, để nâng cấp lên phiên bản mới bạn chạy lệnh: composer global update Một số trường hợp cập nhật bị thất bại, bạn hãy thử, gỡ đi và cài đặt lại nha composer global remove laravel/installer composer global require laravel/installer Bài viết gốc được đăng tải tại chungnguyen.xyz Có thể bạn quan tâm: Cài đặt Laravel Làm thế nào để chạy Sql Server Installation Center sau khi đã cài đặt xong Sql Server? Quản lý các Laravel route gọn hơn và dễ dàng hơn Xem thêm Tuyển dụng lập trình Laravel hấp dẫn trên Station D

By stationd
Principle thiết kế của các sản phẩm nổi tiếng

Principle thiết kế của các sản phẩm nổi tiếng

Tác giả: Lưu Bình An Phù hợp cho các bạn thiết kế nào ko muốn làm code dạo, design dạo nữa, bạn muốn cái gì đó cao hơn ở tầng khái niệm Nếu lập trình chúng ta có các nguyên tắc chung khi viết code như KISS , DRY , thì trong thiết kế cũng có những nguyên tắc chính khi làm việc. Những nguyên tắc này sẽ là kim chỉ nam, nếu có tranh cãi giữa các member trong team, thì cứ đè nguyên tắc này ra mà giải quyết (nghe hơi có mùi cứng nhắc, mình thì thích tùy cơ ứng biến hơn) Tìm các vị trí tuyển dụng designer lương cao cho bạn Nguyên tắc thiết kế của GOV.UK Đây là danh sách của trang GOV.UK Bắt đầu với thứ user cần Làm ít hơn Thiết kế với dữ liệu Làm mọi thứ thật dễ dàng Lặp. Rồi lặp lại lần nữa Dành cho tất cả mọi người Hiểu ngữ cảnh hiện tại Làm dịch vụ digital, không phải làm website Nhất quán, nhưng không hòa tan (phải có chất riêng với thằng khác) Cởi mở, mọi thứ tốt hơn Bao trừu tượng luôn các bạn, trang Gov.uk này cũng có câu tổng quát rất hay Thiết kế tốt là thiết kế có thể sử dụng. Phục vụ cho nhiều đối tượng sử dụng, dễ đọc nhất nhất có thể. Nếu phải từ bỏ đẹp tinh tế – thì cứ bỏ luôn . Chúng ta tạo sản phẩm cho nhu cầu sử dụng, không phải cho người hâm mộ . Chúng ta thiết kế để cả nước sử dụng, không phải những người đã từng sử dụng web. Những người cần dịch vụ của chúng ta nhất là những người đang cảm thấy khó sử dụng dịch...

By stationd
Hiểu về trình duyệt – How browsers work

Hiểu về trình duyệt – How browsers work

Bài viết được sự cho phép của vntesters.com Khi nhìn từ bên ngoài, trình duyệt web giống như một ứng dụng hiển thị những thông tin và tài nguyên từ server lên màn hình người sử dụng, nhưng để làm được công việc hiển thị đó đòi hỏi trình duyệt phải xử lý rất nhiều thông tin và nhiều tầng phía bên dưới. Việc chúng ta (Developers, Testers) tìm hiểu càng sâu tầng bên dưới để nắm được nguyên tắc hoạt động và xử lý của trình duyệt sẽ rất hữu ích trong công việc viết code, sử dụng các tài nguyên cũng như kiểm thử ứng dụng của mình. Cách để npm packages chạy trong browser Câu hỏi phỏng vấn mẹo về React: Component hay element được render trong browser? Khi hiểu được cách thức hoạt động của trình duyệt chúng ta có thể trả lời được rất nhiều câu hỏi như: Tại sao cùng một trang web lại hiển thị khác nhau trên hai trình duyệt? Tại sao chức năng này đang chạy tốt trên trình duyệt Firefox nhưng qua trình duyệt khác lại bị lỗi? Làm sao để trang web hiển thị nội dung nhanh và tối ưu hơn một chút?… Hy vọng sau bài này sẽ giúp các bạn có một cái nhìn rõ hơn cũng như giúp ích được trong công việc hiện tại. 1. Cấu trúc của một trình duyệt Trước tiên chúng ta đi qua cấu trúc, thành phần chung và cơ bản nhất của một trình duyệt web hiện đại, nó sẽ gồm các thành phần (tầng) như sau: Thành phần nằm phía trên là những thành phần gần với tương tác của người dùng, càng phía dưới thì càng sâu và nặng về xử lý dữ liệu hơn tương tác. Nhiệm...

By stationd
Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Lĩnh vực EdTech (ứng dụng công nghệ vào các sản phẩm giáo dục) trên toàn cầu hiện nay đã tương đối phong phú với nhiều tên tuổi lớn phân phối đều trên các hạng mục như Broad Online Learning Platforms (nền tảng cung cấp khóa học online đại chúng – tiêu biểu như Coursera, Udemy, KhanAcademy,…) Learning Management Systems (hệ thống quản lý lớp học – tiêu biểu như Schoology, Edmodo, ClassDojo,…) Next-Gen Study Tools (công cụ hỗ trợ học tập – tiểu biểu như Kahoot!, Lumosity, Curriculet,…) Tech Learning (đào tạo công nghệ – tiêu biểu như Udacity, Codecademy, PluralSight,…), Enterprise Learning (đào tạo trong doanh nghiệp – tiêu biểu như Edcast, ExecOnline, Grovo,..),… Hiện nay thị trường EdTech tại Việt Nam đã đón nhận khoảng đầu tư khoảng 55 triệu đô cho lĩnh vực này nhiều đơn vị nước ngoài đang quan tâm mạnh đến thị trường này ngày càng nhiều hơn. Là một trong những xu hướng phát triển tốt, và có doanh nghiệp đã hoạt động khá lâu trong ngành nêu tại infographic như Topica, nhưng EdTech vẫn chỉ đang trong giai đoạn sơ khai tại Việt Nam. Tại Việt Nam, hệ sinh thái EdTech trong nước vẫn còn rất non trẻ và thiếu vắng nhiều tên tuổi trong các hạng mục như Enterprise Learning (mới chỉ có MANA), School Administration (hệ thống quản lý trường học) hay Search (tìm kiếm, so sánh trường và khóa học),… Với chỉ dưới 5% số dân công sở có sử dụng một trong các dịch vụ giáo dục online, EdTech cho thấy vẫn còn một thị trường rộng lớn đang chờ được khai phá. *** Vừa qua Station D đã công bố Báo cáo Vietnam IT Landscape 2019 đem đến cái nhìn toàn cảnh về các ứng dụng công...

By stationd