2012-10-10 4 views
0

GCD 디스패치 큐를 사용하여보기 컨트롤러가 인스턴스화 될 때 일부 보고서를 생성합니다 - 사용자가 공유 할 수 있다고보고합니다. UIActionSheet.GCD Dispatch - 다른 메소드가 호출 될 때 알림을 전송합니다.

내 질문은 : ViewController가로드 될 때 디스패치 대기열에 대한 보고서를 생성하기 때문에 - 작업 버튼 방법 (다른 방법)에 알림을 보낼 수있는 방법 - 완료되었거나 완료되지 않은 경우 - 사용자가 ViewController가로드되면 즉시 해당 버튼을 누르기로 결정합니다.?

지금은 디스패치 대기열이 완료되면 자체 스레드를 전환하는 주 스레드에서 BOOLEAN 플래그를 사용하고 대기열이 완료되지 않은 경우 버튼을 비활성화하는 조건을 입력합니다. 그러나 이것은 사용자가 그것이 틀린 것이라고 믿게 만들 수 있기 때문에 OK가 아닙니다.

나는 사용자가 동작 버튼을 누르고, 동작 시트를 보여주고, 사용자가 선택한 공유 동작을 누를 수있게하고, 대기열이 아직 끝나지 않았 으면 대기열을 차단하지 않고 대기열이 완료 될 때까지 기다려야한다. UI를 누른 다음 예를 들어 MailComposer를 표시합니다.

P. 위에서 언급 한 BOOL 플래그를 사용하여 동작 버튼 메서드에서 while 루프를 사용하여이 작업을 시도했지만 UI 블록은 그 상태를 영원히 차단합니다.

이있는 viewDidLoad에 대한 보고서를 생성하는 코드입니다

dispatch_queue_t emailqueue; 

    emailqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 

    dispatch_async(emailqueue, ^{ 
     [reportGenerator generate_Email_Report]; 
     [reportGenerator generate_PDF_Report]; 
     dispatch_async(dispatch_get_main_queue(), ^{done = YES;});}); 

    dispatch_release(emailqueue); 

그리고 이것은 내가 작업 버튼을 사용하는 것입니다 :

if (done == YES) 
    { 
    if (version >= 6.0) 
    { 
     //UIActivityViewController *shareController = [[UIActivityViewController alloc] initWithActivityItems:@[ profileName.text,profileImage] applicationActivities:nil]; 
     //[self presentViewController:shareController animated:YES completion:nil]; 
    } 

    else 
    { 
     UIActionSheet *selectSource = [[UIActionSheet alloc] 
             initWithTitle:nil 
             delegate:self 
             cancelButtonTitle:@"Cancel" 
             destructiveButtonTitle:nil 
             otherButtonTitles:@"Send Report To Mail", 
             @"Send Report PDF To Mail", nil]; 
     selectSource.delegate = self; 
     [selectSource showInView:self.view]; 
     selectSource.actionSheetStyle = UIActionSheetStyleBlackTranslucent; 
    } 
    } 

답변

1

내가 NSNotification을 사용합니다. 해당 알림에 대한 관찰자로 원하는 클래스를 추가하고 이에 대한 응답으로 원하는 모든 동작을 수정할 수 있습니다. 그냥 주 스레드에 게시해야합니다. 따라서 처리가 백그라운드에서 실행중인 경우 완료 될 때마다 사용자가 원하는 것을 수행하도록 알림을 기본 대기열에 게시하십시오.

수정 사항을 보았습니다. 단추를 비활성화하지 않으려면 UIActivityIndicatorView로 다음 VC를 표시하고 알림을 받으면 회 전자를 제거하고보기를로드하고 사용자가 무엇이든 할 수있게하십시오.

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(handleThisNotification:) 
    name:WhateverYouDecideToNameYourNotification 
object:nil]; 

    -(void)handleThisNotification { 
     //load your view controller and remove the spinner 
    } 
+0

그래서 나는 액션 버튼을 실시간으로 파견 큐에서 알림 (상태를 확인하기 위해 버튼을 여러 번 눌러 사용자없이) 기다릴 수 있는가? 이 문제를 해결하기 위해 NSNotification의 어떤 메소드를 사용해야합니까? 감사 ! – Razvan

+0

글쎄, NSNotificationCenter와 함께 노력했지만 블록이 처리를 마쳤을 때 알림이 게시되지 않는 것으로 보입니다. 메소드가 디스패치 블록이 완료되기를 기다리는 다른 옵션은 없습니까? 나는 dispatch_sync로 시도했지만 기다리지 않는다. 같은 큐에 있더라도 다른 메서드에서 호출하기 때문에 다른 디스패치 프로세스가 시작됩니다. – Razvan

+0

나는 분명히해야했는데, 원하는대로 알림을 작성하여 게시하십시오. – geraldWilliam

관련 문제