2

オブジェクトを返すメソッドfetchFromWebがあります。このメソッドをGCDから非同期的に呼び出したい。非同期で呼び出されているメソッドからの戻り値を取得する方法を誰かが説明できますか?

または、オブジェクト値を設定してから、ある種の通知を設定し、このメソッドからの戻り値を明示的に取得しないようにする必要がありますか?

これが私が持っているものであり、感謝しています!

        dispatch_async(kBGQueue, ^{


            NSData *data = [NSData dataWithContentsOfURL:kURL];
            [self performSelectorOnMainThread:@selector(fetchFromWeb:) 
                                   withObject:data 
                                waitUntilDone:YES];

            //Need to get the return value from method fetchFromWeb in selector....

        });
4

2 に答える 2

4

dataWithContentsOfURLは、Web URLではなく、ファイルURL専用です。非同期ではありません。GCDを使用して独自のスレッドに送信したとしても、それを行う正しい方法ではありません。

Webにアクセスする必要がある場合は、NSURLConnectionを使用する必要があります。

+(void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue )queue completeHandler:(void(^)(NSURLResponse、NSData *、NSError *))handlerを使用します

最初は正しい方向に進んでいました。メソッドからの戻り値は必要ありません。完了ハンドラーブロックに、受け取ったデータを使用してプロパティ(ivar)を設定させ、提案したように、ブロックの最後にある通知を使用して、完了したことを警告します。その通知により、プロパティにアクセスするメソッドが起動され、データオブジェクトにアクセスできます。

于 2012-07-31T16:22:40.613 に答える
2

performSelectorOnMainThread:withObject:waitUntilDone:あなたはそれからリターンを得ることができないので、使用しないでください。代わりにメインディスパッチキューで使用してください。dispatch_syncこれは。と同じ効果がありperformSelectorOnMainThread:withObject:waitUntilDone:YESます。

dispatch_async(kBGQueue, ^{

    NSData *data = [NSData dataWithContentsOfURL:kURL];

    __block id result = nil; // Use the correct type here.
    dispatch_sync(dispatch_get_main_queue(), ^{

        result = [self fetchFromWeb:data];
    });

    // Do something with result here.
});


編集:Jason Howlinが指摘したように、dataWithContentsOfURL:アプリケーションの出荷には使用しないでください。nクイックダーティデバッグツールとして使用することはNSURLConnection問題ありませんが、それを行う正しい方法です。iOS 5.0の時点では+sendAsynchronousRequest:queue:completionHandler:、使用するのはそれほど難しくありません。

于 2012-07-31T16:00:51.403 に答える