2013-10-22 7 views
4

입니다. ReactiveCocoa는 콜렉션보기의 가장자리를 맞추기 전에 더 많은 게시물을로드하는 컬렉션보기에서 App.net 게시물의 간단한 모음 인 ReactiveCocoa를 사용하여 작업했습니다.RACCommand 초기화 프로그램 신호가 실행되지 않습니다. 신호가

그러나 내보기 모델에 명령을 사용하는 데 문제가 있습니다. 나는 AFNetworking 클라이언트를 통해 게시물을로드하고 그들이 모델링 된 후에 응답하는 명령을 만들었습니다. 완료되면, 생성 된 명령에 대한 응답을 신호로 보내고 신호를 완료합니다.

self.loadPostsCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { 
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { 
     [[EPHTTPClient sharedClient] getGlobalTimelinePostsWithSuccess:^(NSURLSessionDataTask *task, id responseObject) { 
      [self.posts addObjectsFromArray:responseObject]; 
      [subscriber sendNext:responseObject]; 
      [subscriber sendCompleted]; 
     } failure:^(NSURLSessionDataTask *task, NSError *error) { 
      [subscriber sendError:error]; 
     }]; 

     return nil; 
    }]; 
}]; 

필자는 나머지 게시물 수를 보내도록 신호를 작성합니다.

@weakify(self); 

RACSignal *postsRemainingSignal = [[RACObserve(self.collectionView, contentOffset) map:^(id value) { 
    // The value returned from the signal will be an NSValue 
    CGPoint offset = [value CGPointValue]; 
    NSNumber *postsPassed = @(floorf(offset.x/320) + 1); 

    return @([self.postQueue.posts count] - [postsPassed integerValue]); 
}] distinctUntilChanged]; 

나는 내보기 모델에 따라 이러한 값을 보냅니다.

// Send the values of the posts to the view model 
[postsRemainingSignal subscribeNext:^(id x) { 
    [self.postQueue.postsRemainingSubject sendNext:x]; 
}]; 

// When the load command is executed, update our view accordingly 
[self.postQueue.loadPostsCommand.executionSignals subscribeNext:^(RACSignal *loadSignal) { 
    [loadSignal subscribeCompleted:^{ 
     @strongify(self); 
     [self.collectionView reloadData]; 
    }]; 
}]; 

뷰 모델의 대상은 같은 인스턴스화 예상대로

// Create a subject to send view values to 
self.postsRemainingSubject = [RACSubject subject]; 

// Load more posts when less than 4 posts remain 
[self.postsRemainingSubject subscribeNext:^(id x) { 
    if ([x integerValue] < 4) { 
     [self.loadPostsCommand execute:nil]; 
    } 
}]; 

모두는 내 명령의 신호 값과 완료를 보내는 제외하고 작동합니다. 네트워크 요청이 발생하면 내 게시물이 모델링되지만보기에는 self.postQueue.loadPostsCommand.executionSignals 신호에 대한 값이 수신되지 않습니다.

분기 다시로드 신호 재 작업에서 다시 my project is on GitHub. 이견있는 사람?

+0

리포를 업데이트 할 수 있습니까? 나는 이것을 파고 들려고했지만 Repo에는이 질문과 다른 코드가 있습니다. –

+0

여기에서 분기 reload-signal-rework를 확인하십시오. https://github.com/eliperkins/MVVMExample/tree/reload-signal-rework –

+1

사과를 수락 할 수 없습니다. –

답변

5

postsRemainingSubject (궁극적으로 -execute:이 호출 됨)으로 전송 한 후 executionSignals에 가입하는 것이 문제입니다.

서브 스크립 션을 postsRemainingSubject을 전송하는 블록 위에 executionSignals으로 이동하면 구독 차단 호출이 표시됩니다.

+0

감사합니다. 이것은 완벽하게 작동했습니다. 이 주제에 대한 적절한 사용 사례입니까? 나는 RAC 문서가 피사체로부터 벗어날 것을 말하는 것을 느낍니다 ... –

+0

이 경우 피사체를 사용하는 대신 전통적인 속성을 사용할 수 있습니다. '-sendNext :'를 속성에 할당하고 'RACObserve (obj, property)'의 가입자로 대체하십시오. 말이 돼? –

관련 문제