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;
}
}
그래서 나는 액션 버튼을 실시간으로 파견 큐에서 알림 (상태를 확인하기 위해 버튼을 여러 번 눌러 사용자없이) 기다릴 수 있는가? 이 문제를 해결하기 위해 NSNotification의 어떤 메소드를 사용해야합니까? 감사 ! – Razvan
글쎄, NSNotificationCenter와 함께 노력했지만 블록이 처리를 마쳤을 때 알림이 게시되지 않는 것으로 보입니다. 메소드가 디스패치 블록이 완료되기를 기다리는 다른 옵션은 없습니까? 나는 dispatch_sync로 시도했지만 기다리지 않는다. 같은 큐에 있더라도 다른 메서드에서 호출하기 때문에 다른 디스패치 프로세스가 시작됩니다. – Razvan
나는 분명히해야했는데, 원하는대로 알림을 작성하여 게시하십시오. – geraldWilliam