Swift RxSwift專題 : Observable的特征序列

Observable的特征序列,這些特征序列可以幫助我們更準確的描述序列

Single

SingleObservable 的另外一個版本。不像 Observable 可以發出多個元素,它要么只能發出一個元素,要么產生一個 error 事件。

  • 發出一個元素,或一個 error 事件
  • 不會共享狀態變化

一個比較常見的例子就是執行 HTTP 請求,然后返回一個應答或錯誤。不過你也可以用 Single 來描述任何只有一個元素的序列。

源文檔中 ,訂閱提供一個 SingleEvent 的枚舉:

public enum SingleEvent<Element> {
    case success(Element)
    case error(Swift.Error)
}

所以使用Rx的時候注意方法

Single_Method("hello world").subscribe(onSuccess: ((Any) -> Void)?,
                                       onError: ((Error) -> Void)? )

Demo

//特征序列 : Single  : 做網絡請求
func Single_Method(_ repo : String) -> Single<Any> {
    return Single<Any>.create(subscribe: { (single) -> Disposable in
        let url = URL(string: "www.baidu.com\(repo)")!
        let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
        if let error = error {
            single(.error(error))
            return
        }
        guard
            let data = data ,
            let json = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) ,
            let result = json as? [String : Any] else {
            return
            }
            single(.success(result))
        })
        task.resume()
        return Disposables.create()
    })
}
    
func Single_Use()  {
    Single_Method("hello world").subscribe(onSuccess: { (result) in
        print(result)
    }) { (error) in
        print(error)
    }
}


重要 : 這里唯一不好的地方是 single(.success(result)) 與 single(.error(error)),沒有語法糖提示.



Completable

CompletableObservable 的另外一個版本。不像 Observable 可以發出多個元素,它要么只能產生一個 completed 事件,要么產生一個 error 事件。

  • 發出零個元素
  • 發出一個 completed 事件或者一個 error 事件
  • 不會共享狀態變化

Completable 適用于那種你只關心任務是否完成,而不需要在意任務返回值的情況。它和 Observable<Void> 有點相似。

源文檔中 ,訂閱提供一個 CompletableEvent 的枚舉:

public enum CompletableEvent {
    case error(Swift.Error)
    case completed
}
//特征序列 : Completeable  : 處理事件的結果.
func completeable_Method() -> Completable {
    return Completable.create(subscribe: { (complete) -> Disposable in
        //做一些處理,返回BOOL類型的值 , 假設有個屬性completeFlag為true
        let success = self.completeFlag
        if success == false {
            complete(.error(self.error!))
        } else {
            complete(.completed)
        }
        
        return Disposables.create()
    })
}
    
func complete_Use()  {
    completeable_Method().subscribe(onCompleted: {
        print("complete")
    }) { (error) in
        print(error)
    }
}



看了前面兩個,下面三個大概也知道具體的操作了.模板基本一致.注意的是:

  • Event 的枚舉
  • Event 的調用(沒有語法糖提示)
  • 每個方法最后return Disposables.create() (這個接下來了解)
  • 通過rx的方式調用用法的時候注意選擇subscribe的方法,對應Event 的枚舉



Maybe

MaybeObservable 的另外一個版本。它介于 SingleCompletable 之間,它要么只能發出一個元素,要么產生一個 completed 事件,要么產生一個 error 事件。

  • 發出一個元素或者一個 completed 事件或者一個 error 事件
  • 不會共享狀態變化

如果你遇到那種可能需要發出一個元素,又可能不需要發出時,就可以使用 Maybe

Driver

Driver是一個精心準備的特征序列。它主要是為了簡化 UI 層的代碼。不過如果你遇到的序列具有以下特征,你也可以使用它:

  • 不會產生 error 事件
  • 一定在 MainScheduler 監聽(主線程監聽)
  • 共享狀態變化

這些都是驅動 UI 的序列所具有的特征。

ControlEvent (文檔里面沒有具體的介紹)

ControlEvent 專門用于描述 UI 控件所產生的事件,它具有以下特征:

  • 不會產生 error 事件
  • 一定在 MainScheduler 訂閱(主線程訂閱)
  • 一定在 MainScheduler 監聽(主線程監聽)

共享狀態變化



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容