2012-09-12 3 views
1

블록 기반 작업을 한 번에 하나씩 실행하려는 뷰 컨트롤러가있는 경우 완료 블록이 실행 된 후 어떻게 컨트롤을 뷰 컨트롤러에 다시 제공 할 수 있습니까?중첩 된 블록 피하기

ViewControllerOne은 각 작업의 결과에 의존하는 많은 작업을 실행하려고하는데, 각 완료 블록이 실행 된 후에이 컨트롤이 어떻게 다시 viewcontroller에 제공 될까요?

필자는 이것에 대해 생각하기 시작했고, 깊이 읽혀진 블록 패턴으로 향하고 있었는데, 분명히 혼란스러워 할 것입니다.

작업이 실행되고 완료 블록은 다음 작업에서 필요로하는 결과 또는 오류를 반환합니다.이 작업은 자체 완료 작업을 갖고 다음 작업이 의존합니다.

어떻게 컨트롤을 한 곳에서 관리 할 수 ​​있습니까?

완료 블록은 호출되는 뷰 컨트롤러 (자체)에 대한 포인터를 사용하여 다음 작업을 처리하는 다음 함수를 호출하겠습니까?

+0

다음 답변을 보면 블럭 블록 내 표기법이 혼란 스럽습니까? http://stackoverflow.com/a/12319285/250164 - 완료 블록 내에서 View Controller의 메서드를 호출 할 수 있습니다.이 컨트롤러는 뷰 컨트롤러로 다시 제어 할 수있는 방법입니다. –

답변

1

viewController (VC)에 '주는 제어'에 대한 의견은 VC가 runLoop 콜백에서 일반적으로 일어나기를 기다리고 차단된다는 점에서 감지하지 못합니다.

내가 원하는 것을 이해한다면,이 모든 일이 일어나고있는 동안 VC에게 다른 메시지를 처리 ​​할 수있는 기회가 주어집니다. 방법을 정의하십시오 :

{ 
    NSMutableArray *blocks; // ivar 
    BOOL isCanceled; 
} 
typedef void (^block_t)(id input); 

-(void)performBlock:(id)result; 

모든 블록을 한 번에 만들거나 느긋하게 만들지 만 블록 배열에 추가하십시오. 각 블록은 하나의 객체가 필요한 :

block_t b = ^(id input) { 
    ... do some work using input; 
    NSDictionary *dict = ....; // a possible result of the work 
    dispatch_async(dispatch_get_main_queue(), ^{ [self performBlock:dict; }); 
}; 

첫 번째 블록이 어떤 대기열에 작업됩니다 작업 항목을 포함하는 그에게 전달되는 것은 - 너무 배경 큐, 그리고 그것은 VC에 다시 결과를 전송 수 :

2

이 무엇을 달성하려고하는 것은 나에게 조금 불분명하지만,이 같은 시도 할 수 : 각 블록은 이전 블록의 결과에 의존하기 때문에

- (id)performBlocks:(NSArray *)blocks 
{ 
    id state = [self initialState]; 

    for(id (^block)(id) in blocks) 
    { 
     state = block(state); 

     // do something with state 
    } 

    return state; 
} 

을, 당신은 직렬을 실행해야 . 각 블록에 의해 업데이트 된 상태 객체를 전달한 다음 연속 블록에 대한 호출간에 호출간에 상태에 따라 처리를 수행 할 수 있습니다.

+0

그게 내가 무엇에지고 있던지 아닙니다. 나는 여러 객체들을 다루고 이들 객체들을 다루기 위해 여러 블록들을 파견 할 것이다. 긴 이야기. 어쨌든, 나는 질문을하면서 그것을 해결했다. 건배.:) – jarryd

+0

좋아요, 당신이 이것을 위해 무엇을했는지에 대한 빠른 아이디어를 줄 수 있습니까? 기억할 유용한 기술이 될 것 같은 소리. – attente

+0

그래, 나도 너의 해결책을보고 싶다. Helium3 – djskinner

1

이것은 NSOperation의 종속성 기능에 이상적인 사용법입니다. 즉,

- (void)addDependency:(NSOperation *)operation 
- (void)removeDependency:(NSOperation *)operation 

당신은 특정 작업이 다른 작업에 의존 할 수 있습니다, 그래서 당신은 작업 간의 의존 관계 그래프를 구축 할 수 있습니다.