咱們先看一下 RxSwift 可以幫助咱們作些什麼:面試
傳統實現方法:算法
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)免費獲取! 獲取面試資料 簡歷模板 一塊兒交流技術
這樣你可用寥寥幾行代碼來完成至關複雜的異步操做。