爲何要使用 RxSwift ?

爲何要使用 RxSwift ?

咱們先看一下 RxSwift 可以幫助咱們作些什麼:面試

Target Action

傳統實現方法:算法

button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

複製代碼
func buttonTapped() {
    print("button Tapped")
}

複製代碼

經過 Rx 來實現:編程

button.rx.tap
    .subscribe(onNext: {
        print("button Tapped")
    })
    .disposed(by: disposeBag)

複製代碼

你不須要使用 Target Action,這樣使得代碼邏輯清晰可見。markdown

代理

傳統實現方法:網絡

class ViewController: UIViewController {
    ...
    override func viewDidLoad() {
        super.viewDidLoad()
        scrollView.delegate = self
    }
}

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print("contentOffset: \(scrollView.contentOffset)")
    }
}

複製代碼

經過 Rx 來實現:多線程

class ViewController: UIViewController {
    ...
    override func viewDidLoad() {
        super.viewDidLoad()

        scrollView.rx.contentOffset
            .subscribe(onNext: { contentOffset in
                print("contentOffset: \(contentOffset)")
            })
            .disposed(by: disposeBag)
    }
}

複製代碼

你不須要書寫代理的配置代碼,就能得到想要的結果。閉包

閉包回調

傳統實現方法:架構

URLSession.shared.dataTask(with: URLRequest(url: url)) {
    (data, response, error) in
    guard error == nil else {
        print("Data Task Error: \(error!)")
        return
    }

    guard let data = data else {
        print("Data Task Error: unknown")
        return
    }

    print("Data Task Success with count: \(data.count)")
}.resume()

複製代碼

經過 Rx 來實現:併發

URLSession.shared.rx.data(request: URLRequest(url: url))
    .subscribe(onNext: { data in
        print("Data Task Success with count: \(data.count)")
    }, onError: { error in
        print("Data Task Error: \(error)")
    })
    .disposed(by: disposeBag)

複製代碼

回調也變得十分簡單app

通知

傳統實現方法:

var ntfObserver: NSObjectProtocol!

override func viewDidLoad() {
    super.viewDidLoad()

    ntfObserver = NotificationCenter.default.addObserver(
          forName: .UIApplicationWillEnterForeground,
          object: nil, queue: nil) { (notification) in
        print("Application Will Enter Foreground")
    }
}

deinit {
    NotificationCenter.default.removeObserver(ntfObserver)
}

複製代碼

經過 Rx 來實現:

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.rx
        .notification(.UIApplicationWillEnterForeground)
        .subscribe(onNext: { (notification) in
            print("Application Will Enter Foreground")
        })
        .disposed(by: disposeBag)
}

複製代碼

你不須要去管理觀察者的生命週期,這樣你就有更多精力去關注業務邏輯。

多個任務之間有依賴關係

例如,先經過用戶名密碼取得 Token 而後經過 Token 取得用戶信息,

傳統實現方法:

/// 用回調的方式封裝接口
enum API {

    /// 經過用戶名密碼取得一個 token
    static func token(username: String, password: String,
        success: (String) -> Void,
        failure: (Error) -> Void) { ... }

    /// 經過 token 取得用戶信息
    static func userinfo(token: String,
        success: (UserInfo) -> Void,
        failure: (Error) -> Void) { ... }
}

複製代碼
/// 經過用戶名和密碼獲取用戶信息
API.token(username: "beeth0ven", password: "987654321",
    success: { token in
        API.userInfo(token: token,
            success: { userInfo in
                print("獲取用戶信息成功: \(userInfo)")
            },
            failure: { error in
                print("獲取用戶信息失敗: \(error)")
        })
    },
    failure: { error in
        print("獲取用戶信息失敗: \(error)")
})

複製代碼

經過 Rx 來實現:

/// 用 Rx 封裝接口
enum API {

    /// 經過用戶名密碼取得一個 token
    static func token(username: String, password: String) -> Observable<String> { ... }

    /// 經過 token 取得用戶信息
    static func userInfo(token: String) -> Observable<UserInfo> { ... }
}

複製代碼
/// 經過用戶名和密碼獲取用戶信息
API.token(username: "beeth0ven", password: "987654321")
    .flatMapLatest(API.userInfo)
    .subscribe(onNext: { userInfo in
        print("獲取用戶信息成功: \(userInfo)")
    }, onError: { error in
        print("獲取用戶信息失敗: \(error)")
    })
    .disposed(by: disposeBag)

複製代碼

這樣你能夠避免回調地獄,從而使得代碼易讀,易維護。

等待多個併發任務完成後處理結果

例如,須要將兩個網絡請求合併成一個,

經過 Rx 來實現:

/// 用 Rx 封裝接口
enum API {

    /// 取得老師的詳細信息
    static func teacher(teacherId: Int) -> Observable<Teacher> { ... }

    /// 取得老師的評論
    static func teacherComments(teacherId: Int) -> Observable<[Comment]> { ... }
}

複製代碼
/// 同時取得老師信息和老師評論
Observable.zip(
      API.teacher(teacherId: teacherId),
      API.teacherComments(teacherId: teacherId)
    ).subscribe(onNext: { (teacher, comments) in
        print("獲取老師信息成功: \(teacher)")
        print("獲取老師評論成功: \(comments.count) 條")
    }, onError: { error in
        print("獲取老師信息或評論失敗: \(error)")
    })
    .disposed(by: disposeBag)

複製代碼

做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是個人iOS交流圈: 無論你是小白仍是大牛歡迎入駐!! 分享內容包括逆向安防、算法、架構設計、多線程,網絡進階,還有底層、音視頻、Flutter等等......

本身根據梳理網絡來的的開發經驗總結的學習方法,無償分享給你們。更多資源,須要的話均可以自行來獲取下載。 +裙:196800191、 或者是+ WX(XiAZHiGardenia)免費獲取! 獲取面試資料 簡歷模板 一塊兒交流技術

(資源集合)

這樣你可用寥寥幾行代碼來完成至關複雜的異步操做。


那麼爲何要使用 RxSwift ?

  • 複合 - Rx 就是複合的代名詞
  • 複用 - 由於它易複合
  • 清晰 - 由於聲明都是不可變動的
  • 易用 - 由於它抽象的了異步編程,使咱們統一了代碼風格
  • 穩定 - 由於 Rx 是徹底經過單元測試的
相關文章
相關標籤/搜索