performSelectorOnMainThread
私の質問のタイトルが言ったように..私は次のように呼び出すと、 .. my function returnで非 void 関数を呼び出そうとしていますUIImage
:
UImage *img = [self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES];
互換性のない割り当てタイプがあるというエラーが表示されます。また、このようにキャストしようとします
UImage *img = (UIImage*)[self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES];
そして、セマンティックの問題を取得しました :算術またはポインター型が必要なタイプ「void」のオペランド
通常どおり呼び出すことができることはわかっていますが、マルチスレッド化を試みており、このように呼び出す必要があります..どうすればこのエラーを防ぐことができますか?
編集 :
この関数 (captureScreen) 内で GCD を使用しようとすると、「viewToCapture」で Exc_bad_access を作成し続けるので、GCD ブロック内で親関数を呼び出すことにします。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
[self captureScreenDelayed:pageView];
dispatch_sync(dispatch_get_main_queue(), ^{
});
});
「captureScreenDelayed :」は次のとおりです。
- (void) captureScreenDelayed:(EpubPageViewController*)pageView
{
if(!pageView)
pageView = [self currentPageView];
if(pageView.pageImageView)
pageView.pageImageView.image = (UIImage*)[self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES];
}
とcaptureScreen :
-(UIImage*)captureScreen:(UIView*) viewToCapture
{
UIGraphicsBeginImageContextWithOptions(viewToCapture.bounds.size, viewToCapture.opaque, 0.0);
[viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return viewImage;
}
正直なところ、これが別のスレッドで画像を取得する正しい方法かどうかはわかりません...アドバイスをいただければ幸いです。