RxSwift: Bài 6: RxCocoa (Part 2)
RxSwift
20
swift
68
ios
54
RxCocoa
6
Male avatar

Bùi Khánh Duy viết ngày 30/06/2018

RxSwift: Bài 6: RxCocoa (Part 2)

=====
Updated ngày 30/06

Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog, mình mới dọn về nhà mới ở đây, thoải mái, đẹp đẽ rõ ràng hơn kipalog. Mong các bạn có thể theo dõi tại trang web của mình để cập nhật thêm nha

Mình mới viết một loạt bài về chủ đề Clean Architecture và Service Locator. Các bạn có thể theo dõi.
Page trên facebook ở đây: ở đây

=====
Retrieving data from the OpenWeather API
Trong ApiController, ta thay fake data bằng đoạn code sau:

func currentWeather(city: String) -> Observable<Weather> {
  return buildRequest(pathComponent: "weather", params: [("q", city)])
  .map { json in
    return Weather(
      cityName: json["name"].string ?? "Unknown",
      temperature: json["main"]["temp"].int ?? -1000,
      humidity: json["main"]["humidity"].int  ?? 0,
      icon: iconNameToChar(icon: json["weather"][0]["icon"].string ??
"e")
) }
}

Trong này có hai function cần phân tích:

1.iconNameToChar: nó nhận 1 string từ data JSON và trả về 1 string khác dưới dạng UTF-8 code của icon thời tiết có hình dạng sẽ xuất hiện trên app của bạn:

public func iconNameToChar(icon: String) -> String {
    switch icon {
    case "01d":
        return "\u{f11b}"
      //[...]
    default:
        return "E"
    }
}

2.convenience function buildRequest:
alt text
Nó dùng để tạo network requests, sử dụng RxCocoa’s wrapper đối với NSURLSession để perform như sau:

  • dùng URL rồi append GET (or POST) request
  • sử dụng API của mình để get data
  • đưa nội dung về dạng application/ json
  • chọn nhiệt độ (ở đây là Kevin)
  • đưa dạng json về model

Cuối cùng nó được kết thức bằng dòng sau:

 //[...]
return session.rx.data(request: request).map { JSON(data: $0) }

Cái này dùng rx extension của RxCocoa xung quanh NSURLSession cái mà sử dụng data function. Nó lần lượt trả về 1 Observable. Data này được dùng như là input data để map dùng chuyển từ raw data thành cấu trúc SwiftyJSON data.
Nhìn sơ đồ sau để hiểu rõ hơn cái gì bên trong ApiController:
alt text

Thay đoạn code Observable.just([...]) ban đầu bằng real data. Mở OpenWeatherMap API documentation http://openweathermap.org/current, nó sẽ giải thích kĩ cách lấy get/ post, ví dụ như sau:

api.openweathermap.org/data/2.5/weather?q={city name}

Cái request này sẽ trả về 1 JSON object, sau đó convert với những property cần thiết. Build and run và enter London, kết quả sẽ là:
alt text

App đã chạy rất ok, tuy nhiên nếu bạn refactor thì thử remove cái catchErrorJustReturn operator bên trong flatmap. Ngay khi nhận đc 404 error (thấy trong console ấy), app sẽ show Error như bt bởi vì mình đã xử lý nil coalescing bên trong rồi.
alt text

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

Bùi Khánh Duy

29 bài viết.
10 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
3 3
RxSwift: Bài 1 Observable và Just, Of, From ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalo...
Bùi Khánh Duy viết 5 tháng trước
3 3
Male avatar
3 0
Autolayout và lifecycle trong IOS ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog, mình mớ...
Bùi Khánh Duy viết 3 tháng trước
3 0
Male avatar
2 3
RxSwift: Bài 2 Subscribing to observables ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog,...
Bùi Khánh Duy viết 5 tháng trước
2 3
Bài viết liên quan
Male avatar
0 0
RxSwift: Bài 6: RxCocoa (Part 4) Units ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog, mì...
Bùi Khánh Duy viết 5 tháng trước
0 0
Male avatar
0 0
RxSwift: Bài 6: RxCocoa (Part 5) Disposing with RxCocoa ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông t...
Bùi Khánh Duy viết 5 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
29 bài viết.
10 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!