2015-02-02 2 views
0

일부 하위 호출이 완료되기 전에 RAC 신호가 다음 이벤트 메시지를 보내지 않도록 할 의향이 있습니다. 여기 후속 비동기 호출이 완료되기 전에 신호가 다음 이벤트를 보내는 것을 방지하려면 어떻게해야합니까?

내가 지금까지 진행이 방법의 예입니다 :

- (RACSignal *) fetchNearbyDatasForLocation: (CLLocationCoordinate2D)coordinate { 

    RACSignal* finalSignal = [RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) { 
     [subscriber sendNext:self.rawDatas]; 
     [subscriber sendCompleted]; 
     return nil; 
    }]; 

    return [[[self.apiClient fetchNearbyDatasforLocation:coordinate]    
      flattenMap:^RACStream *(NSArray* datas) { 

        NSMutableArray* signals = [[NSMutableArray alloc] init]; 
        self.rawDatas = datas; 

        for (SNPDataModel* data in datas) { 
         RACSignal* fetchExtraDataSignal = [self.apiClient fetchExtraDataInfoForData:data]; 
         [signals addObject:fetchExtraDataSignal]; 
         RAC(data, extraData) = fetchExtraDataSignal; 

        } 

        // will send a next message when all asynchronous call are completed 
        RACSignal* completedSignal = [RACSignal combineLatest:signals]; 

       return completedSignal; 
      }] 
      flattenMap:^RACStream *(RACTuple* value) { 

       return finalSignal; 

      }]; 
} 
여기 내 코드에 대한

거의 설명 : 나는 모든 fetchExtraDataSignal를 datas의 배열을 가져올 때 같은 배열 신호를 보내려고하고있다 신호가 완료되었습니다 (그래서 배열은 그 때 여분의 데이터 내용을 가져야합니다). 이것을 달성하기위한보다 효과적인 대응 방법이 있습니까? 가능하다면 부동산 데이터에 의지하지 않으려합니다.

+0

나는 다운 투표를 한 이유가 무엇인가요? 제 질문이 불분명합니까? – tiguero

+0

나는 당신의 문제를 해결했고, 당신은 상향 투표했고 선호했다 : 우르 질문은 유용하고 잘 쓰여졌다. :) – Payedimaunt

답변

1

의미가 무엇인지 이해하는 데 자신감이 없지만 "createSignal"과 "flattenMap"의 조합 대신 "map"을 사용하는 것이 좋습니다.

이렇게하면됩니다.

- (RACSignal *) fetchNearbyDatasForLocation: (CLLocationCoordinate2D)coordinate { 
    return [[self.apiClient fetchNearbyDatasforLocation:coordinate] 
     flattenMap:^RACStream *(NSArray* datas) 
    { 
     /* ... */; 
     return [[RACSignal combineLatest:signals] 
      map:^(RACTuple *unused) { return datas; }]]; 
    }]; 
} 

그리고 이벤트 처리기간에 데이터를 교환하기 위해 변경할 수있는 필드를 사용하지 마십시오. 이로 인해 여러 신호가 동시에 작동 할 때 이러한 결과가 예측할 수 없게됩니다.

+0

어떻게 마지막으로 돌아온 장소에서 접속할 수 있습니까? 여기 내 모든 문제가있는 멤버 변수를 사용하지 않아도됩니다. – tiguero

+0

적어도'fetchAllVenuesInfoForLocation'을 구현하려면 위에서 쓴 것처럼 인스턴스 변수를 사용할 필요가없는 것 같습니다. (또는 나는 아마도 당신의 질문을 오해 할 것입니다.) – findall

+0

당신의 대답은 제가 실제로 필요한 것입니다. 이전 코드에서 제거해야 할 것은 RAC (venue, rating) = fetchRatingSignal 인스트럭션뿐이었습니다. 런타임에 크래시가 발생합니다. – tiguero

관련 문제