+1

RxAlamofire

Basic requests

Nó rất đơn giản để thực hiện request bằng cách sử dụng SessionManager mặc định. Nếu bạn không cần sử dụng lại một session tuỳ chỉnh, thì đây có thể là cơ chế đi đến request của bạn:

string(.get, stringURL)
  .subscribe(onNext: { print($0) })
  .addDisposableTo(disposeBag)

Hầu hết bạn sẽ muốn giải quyết và decode JSON đơn giản như sau:

json(.get, stringURL)
  .subscribe(onNext: { print($0) })
  .addDisposableTo(disposeBag)

Kết quả mà Obserable trả ra là một JSON object. Vì type của phần tử là Any, nên bạn cần phải map hoặc cast nó bên trong subscribe. Bạn cũng có thể lấy raw data:

data(.get, stringURL)
  .subscribe(onNext: { print($0) })
  .addDisposableTo(disposeBag)

RxAlamofire định nghĩa ra các biến thể của các convenience functions với request (requestString, requestJSON, requestData), lấy các tham số đầu vào giống nhau nhưng trả về Observable của một tuple của đối tượng HTTPURLResponse cùng với body được decode.

Lưu ý: Rxalamofire request được observables, nếu bạn dispose() một subscribe trước khi request được hoàn tất, request đang gọi sẽ bị cancel. Đây là một hành vi quan trọng của framework, đặc biệt khi thực hiện upload hay downloads lớn.

Tất cả các tính năng trên đều là tiện ích khi sử dụng SessionManager mặc định. Phía dưới, Họ gọi việc thực hiện định nghĩa như extensions đến SessionManager:

let session = NSURLSession.sharedSession()
session.rx.json(.get, stringURL)
  .subscribe(onNext:  { print($0) })
  .adDisposableTo(disposeBag)

Lưu ý: Các phần reactive extensions của SessionManager trả về các Observable của tuple được prefix với response, không phải với request. Ví dụ bạn sẽ sử dụng session.rx.responseJSON(.get, stringURL) để có được một Observable<(HTTPURLResponse, Any)>.

Request customization

Các ví dụ trên đã không sửa đổi các giá trị mặc định cho các thông số tuỳ chỉnh, encode URL và HTTP header. Nhưng cũng dễ dàng:

// get current weather in london
json(.get,
     "http://api.openweathermap.org/data/2.5/weather",
     parameters: ["q": "London", "APPID": "{APIKEY}"])
  .subscribe(onNext: { print($0) })
  .addDisposableTo(disposeBag)

URL request sẽ là http://api.openweathermap.org/data/2.5/weather? q = London & APPID = {APIKEY}. Bạn cũng có thể tuỳ chỉnh header request bằng cách thêm header dictionary.

Lưu ý: Tất cả các ví dụ sử dụng string để request URL. Tất cả APIs trong RxAlamofire chấp nhận tất cả đối tượng phù hợp với URLRequestConvertible protocol, vì vậy bạn không giới hạn ở strings.

Response validation

Request và API session.rx.request cho phép bạn thực hiện validation và thao tác hơn nữa bằng DataRequest. Sau đó, bạn có thể sử dụng tiện ích mở rộng AlamoFire để thực hiện xác nhận hợp lệ, cũng như phần mở rộng thuận tiện của RxAlamofire:

request(.get, stringURL)
  .flatMap { request in
    request
      .validate(statusCode: 200 ..< 300)
      .validate(contentType: ["text/json"])
      .rx.json
}

RxAlamofire cũng cung cấp một phần mở rộng validateSuccessfulResponse () thực hiện việc xác nhận trạng thái mã giống như trên.

Downloading files

Bạn có thể tải file đến một đích xác định theo AlamoFire DownloadDestination bằng kiểu closure :

let destination: DownloadRequest.DownloadFileDestination = { _, response
in
  let docsURL = FileManager.default.urls(for: .documentDirectory,
in: .userDomainMask)[0]
  let filename = response.suggestedFilename ?? "image.png"
  let fileURL = docsURL.appendPathComponent(filename)
  return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
session.download(fileURL, to: destination)
  .subscribe(onCompleted: { print("Download complete") })
  .addDisposableTo(disposeBag)

Tiếp tục tải xuống những thứ đã hủy trước đây cũng được hỗ trợ. Kiểm tra phần mở rộng download(resumeData:to:) đến SessionManager để biết thêm thông tin.

Lưu ý: yêu cầu, API tải xuống và tải lên tất cả đều phát ra một AlamoFire.DataRequest, AlamoFire.DownloadRequest hoặc AlamoFire.UploadRequest tại thời điểm đăng ký, sau đó hoàn tất hoặc lỗi.

Upload tasks

Tải lên cũng không kém phần dễ dàng. Bạn có thể tải lên dữ liệu trong bộ nhớ, các tệp được lưu trữ hoặc thậm chí cung cấp InputStream làm nguồn dữ liệu:

session.upload(someFileURL, stringURL)
  .subscribe(onCompleted: { print("Upload complete") })
  .addDisposableTo(disposeBag)

Download và upload các operatoers trả về Oservable của AlamoFire.DownloadRequest và AlamoFire.UploadRequest tương ứng. Bạn có thể thực hiện xử lý bằng cách tiếp tục xử lý các đối tượng phát ra.

Tracking progress

Theo dõi tiến trình tải lên và tải xuống bằng cách trích xuất một RxProgress <Observable> từ đối tượng AlamoFire.Request phát ra theo yêu cầu, các API tải xuống và tải lên:

session.upload(someFileURL, stringURL)
  .flatMap { request in
    request
      .validateStatusCode()
      .rx.progress
  }
  .subscribe (
    onNext: { progress in
      let percent = Int(100.0f * progress.completed)
      print("Upload progress: \(percent)%")
},
    onCompleted: { print("Upload complete") })
  .addDisposableTo(disposeBag)

Phần mở rộng rx.progress phát ra một phần tử RxProgress đều đặn vào main queue.

Lưu ý: RxAlamofire cho thấy một tập hợp con của API AlamoFire thậm chí còn phong phú hơn.

Nguồn: RxSwift Reactive Programming with Swift - raywenderlich.com Tutorial Team


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí