Как выполнить вызов UIKit для mainthread изнутри блока - PullRequest
2 голосов
/ 23 февраля 2012

Я пытаюсь выдвинуть контроллер представления из блока обратного вызова.Контроллер представления, который я хочу нажать, содержит UIWebView, который жалуется, что я должен вызвать это в главном потоке.Я пытался использовать NSInvocation безрезультатно.Как я могу вызвать presentModalViewController:animated в главном потоке?

[vc requestUserPermissionWithCallback:^(BOOL inGranted)
         {
             if (inGranted)
             {
                 if (serviceType == PXServiceTypeTwitter)
                 {
                     //[ad.rootViewController presentModalViewController:vc animated: YES]; // crashes
                     NSInvocation *invocation = [NSInvocation invocationWithTarget:ad.rootViewController selector:@selector(presentModalViewController:animated:) retainArguments:YES, vc, YES];
                     [invocation invokeOnMainThreadWaitUntilDone:NO]; // same result
                 }
             }
             else
             {
                 [self.navigationController popToRootViewControllerAnimated:YES];
             }
         }];

сообщение об ошибке:

bool _WebTryThreadLock (bool), 0x6b21090: попытался получить веб-блокировку из потокакроме основного потока или веб-потока.Это может быть результатом обращения к UIKit из вторичного потока.Сбой сейчас ...

Я использую категорию NSInvocation + CWVariableArguments .

Ответы [ 2 ]

8 голосов
/ 23 февраля 2012

Просто используйте dispatch_get_main_queue(), чтобы получить основной поток, а затем отправьте на него:

dispatch_async(dispatch_get_main_queue(), ^{
    // whatever code you want to run on the main thread
});
0 голосов
/ 26 февраля 2013

У меня была похожая проблема, и я использовал

performSelectorOnMainThread:withObject:waitUntilDone:

, чтобы решить это. Надеюсь, это поможет.

...