2014-03-12 3 views
1

내 응용 프로그램에는 storeData 및 gotoNextView라는 두 가지 메서드가 있습니다. storeData 메서드가 실행을 완료 한 후 gotoNextPage를 실행해야합니다. storeData에서 나는 Egocache를 사용하여 로그인을 성공한 후에 얻은 토큰을 gotoNextPage에 저장하고있다. 다음 viewcontroller에서 새 뷰 컨트롤러를로드하는 데 사용되는 코드가있다. 다른 세부 정보를 가져 오기 위해 토큰을 사용해야한다. 하지만 문제는 메서드 gotoNextView storeData 전에 실행되고 그래서 다음보기에서 null 토큰 gettin입니다.다른 메서드 완료 후 메서드 실행

나는 다음을 사용하여 시도했다 :

dispatch_group_t group = dispatch_group_create(); 

dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 

    [self storeData]; 

}); 



dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 


    [self gotoNextPage]; 

위의 코드는 목적을 제공하고있다하지만 난 위의 코드를 사용하고 때, 다음보기에서 NSUrlConnections로드되지 않습니다.

[self storeData]; 

[self performSelector:@selector(gotoNextPage) withObject:nil afterDelay:1.0f]; 

이 코드가 작동하고 다음보기에서 NSUrlConnections도 작동하지만, 거기 당신은 storeData 방법에 완료 블록을 전달할 수 이러한 목적을

+1

show'storeData' 메소드 코드 – Shubhank

+1

코드는 첫 번째 블록이 완료된 후에 작동하고 두 번째 블록을 실행해야합니다. 그렇다면 NSURLConnections의 문제점은 무엇입니까? 첫 번째 블록에서 두 가지 방법을 모두 호출 하는게 어때? –

+0

@MartinR 그게 또한 내가 왜 이해가 .. 왜 nsurl 블록이 작동하지 않습니다 – BalaChandra

답변

5

을 달성하기 위해 더 나은 방법입니다. 그런 식으로 storeData는 추측하려는 대신 수행해야 할 작업을 마쳤을 때 알려줍니다.

- (void)storeDataWithCompletion:(void (^)(void))completion 
{ 
    // Store Data Processing... 
    if (completion) { 
     completion(); 
    } 
} 

// Calling storeDataWithCompletion... 
[self storeDataWithCompletion:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self gotoNextPage]; 
    }); 
}]; 

메인 대기열에 대한 dispatch_async는 필요하지 않습니다. 나는 gotoNextPage가 UI와 관련되어 있으며 storeDataWithCompletion : 어떤 스레드가 완성 블록을 호출했는지 분명하지 않기 때문에 추가했다. 이 도움이

Here's a link to Apple's documentation on blocks

희망.

관련 문제