4

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;
}

正直なところ、これが別のスレッドで画像を取得する正しい方法かどうかはわかりません...アドバイスをいただければ幸いです。

4

2 に答える 2

4

ここで覚えておかなければならないことは、実際に呼び出しているメソッドは戻り値の型-performSelectorOnMainThread:withObject:waitUntilDone:を持つということです。(void)したがって、このメソッドを介して返される、実行されたセレクターの結果を取得することはできません。このタイプのマルチスレッドを実行する必要がある場合は、同時実行プログラミング ガイド、特にグランド セントラル ディスパッチを確認する必要があります。

于 2012-05-01T14:41:58.030 に答える
4

performSelectorOnMainThread:...戻り値はありません。イメージを取り戻すには、他のメカニズムを見つける必要があります。セレクターが完了するのを待っているため、この場合に機能する簡単な方法の1つは、NSMutableArrayをオブジェクトとして渡し、メインスレッドで画像を追加することです。

NSMutableArray* parameterArray = [[NSMutableArray alloc] init];
[parameterArray addObject: webView];
[self performSelectorOnMainThread:@selector(captureScreen:) withObject:parameterArray waitUntilDone:YES];
if ([parameterArray count > 1)
{
    UIImage* img = [webView objectAtIndex: 1];
}
else
{ 
// error
}

そして、captureScreen:次のようになります

-(void) captureScreen: (NSMutableArray*) parameterArray
{
    UIView* webView = [parameterArray objectAtIndex: 0];
    // capture the screen
    [parameterArray addObject: capturedImage];
}
于 2012-05-01T14:48:56.863 に答える