2017-04-18 6 views
3

저는 Swift의 새로운 제품입니다. 그래서 Reactive Cocoa v5 또는 Reactive Swift를 처음 사용하게되었습니다. RACSignal에서 ReactiveSwift 또는 RAC5로 마이그레이션

는 이전에 나는 RAC 2.x를 함께 RACSignal을 사용 나는 이런 식으로 뭔가 할 좋아 :

- (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 버전과 같은 구현하는 방법을 예를 들어주십시오, 반응성 스위프트의 모든이 물건에 대해 조금 혼란 스러워요. 홈페이지 요구 사항이 요청을 취소 (또는 신호 처리) 내가 원하는 목적지, 요청이 자동으로 약 SignalSignalProducer을 이해하는 처분

답변

6

중요한 것은에 취소하기 가지고 할 수있는 능력을 가지고있다 HotCold 신호의 차이입니다 .

기본적으로 Hot 신호는 관찰자를 신경 쓰지 않는 신호입니다. 그것은 하나 또는 여러 개의 관찰자가 전혀 없더라도 값을 전송합니다. 그리고 가장 중요한 사항 : 새로운 관찰은 신호에 부작용을 일으키지 않으며 새로운 가입자는 다른 가입자와 똑같은 사건을 겪습니다 (구독 이전에 이미 발생했던 사건을 뺀 것)! 사용자 입력, 센서 데이터 등을 생각하십시오 (센서 시작/중지와 같은 것을 무시하십시오). 내 경험

는 실제 Hot 신호는 대조적

하기, Cold 신호는 관찰자에 대한 관심이다 .. 실제로 드물다 - Cold 신호 각각 구독 잠재적 부작용을 수행하고, 가입자가 수신 그 부작용에 근거한 사건. 따라서 두 명의 관찰자가 각각 한 번 부작용을 시작하고 별개의 사건 집합을 얻습니다.

RAC에서 Cold 신호는 SignalProducer으로 표시됩니다. SignalProducer을 신호 공장 (따라서 이름)으로 생각할 수도 있습니다. start을 입력하면 SignalProducer이 부작용을 일으키고 이벤트가 전송되는 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 자동 완성이 이러한 종류의 신호 생성자 이니셜 라이저를 인식하지 못하기 때문에 혼란 스러웠습니다. 또한 왜 여기에 오류 유형을 사용하도록 허용하지 않는지 알지 못했습니다 ...하지만 대단히 감사합니다. –