2017-04-18 23 views
3

我是Swift新手,這就是爲什麼我是Reactive Cocoa v5或Reactive Swift新手。從RACSignal遷移到ReactiveSwift或RAC5

以前我用RACSignal與RAC 2.x和我喜歡做這樣的事情:

- (RACSignal *)signalForGET:(NSString *)URLString parameters:(NSDictionary *)parameters { 
    return [RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) { 
     AFHTTPRequestOperation *op = [self GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      [subscriber sendNext:responseObject]; 
      [subscriber sendCompleted]; 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      [subscriber sendError:error]; 
     }]; 
     return [RACDisposable disposableWithBlock:^{ 
      [op cancel]; 
     }]; 
    }]; 
} 

在這裏,我喜歡它取消一次性要求,也是我可以通過調用dispose手動取消方法返回的信號。

我有點困惑所有這些東西在無斯威夫特,像SignalProducers等

請給我例子,如何實現與最新斯威夫特/ ReactiveSwift/ReactiveCocoa版本相同。 主要要求是不得不取消請求(或處理信號),無論我想要的,有要求自動獲取有關處置

回答

6

重要的取消,瞭解有關SignalSignalProducer能力HotCold信號之間的區別。

基本上,一個Hot信號是一個不關心其觀察員。它發送它的值,不管它是否有一個,多個甚至沒有觀察者。最重要的是:新的觀測信號不會在信號中產生副作用,每個新用戶將獲得與其他用戶完全相同的事件(減去訂閱前已經發生的事件!)!考慮用戶輸入,傳感器數據等...(忽略諸如啓動/停止傳感器之類的事情)。

以我的經驗,真正Hot信號在實踐中罕見的..

相比之下,Cold信號是一個關心它的觀察員 - 每個訂閱到Cold信號進行潛在的副作用和用戶接收基於這種副作用的事件。所以兩個不同的觀察者每個都會開始一次副作用並獲得不同的事件集合。

在RAC中,Cold信號由SignalProducer表示。您也可以將SignalProducer視爲信號工廠(因此名稱) - startSignalProducer執行副作用並返回發送事件的Signal

這幾乎是你的代碼片段。

Disposable自從RAC 2.x以來沒有多少變化,您仍然可以使用它。你可能錯過了去如何創建一個SignalProducer時使用它:

func producerForGET(urlString: String, parameters: [String: String]) -> SignalProducer<Data, NSError> { 
    return SignalProducer<Data, NSError> { observer, disposable in 
     let operation = GET(url: urlString, parameters: parameters, success: { operation, responseObject in 
      observer.send(value: responseObject) 
      observer.sendCompleted() 
     }, failure: { error in 
      observer.send(error: error) 
     }) 

     disposable += { 
      print("Disposed") 
      operation.cancel() 
     } 
    } 
} 

這裏有一個簡單的例子如何使用此可用於:

producerForGET(urlString: "Bla", parameters: [:]) 
    .start() // Performs the request and returns a Signal 
    .dispose() // Runs the disposable block and cancels the operation 
+0

感謝兄弟。這與我在此之前嘗試的方式大致相同,但因爲Xcode自動完成不識別這種信號生成器初始化程序而感到困惑。此外,我沒有得到它爲什麼不允許在這裏使用錯誤類型的錯誤...但非常感謝你。 –