2

NSMutableURLRequestリクエストを入れましたdispatch_asyncが、うまくいきません。ただし、NSURLRequest動作します。コード:

dispatch_queue_t queue1 = dispatch_get_global_queue(0, 0);
dispatch_async(queue1, ^{

    NSMutableURLRequest* request  = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
    [request setHTTPMethod:@"GET"];
    NSURLConnection* connection = [NSURLConnection connectionWithRequest:request delegate:nil];
    [connection start];//It doesn't work!

    //***
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
    NSURLResponse* theResponse = nil;
    NSError* theError = nil;
    NSData* data = [NSURLConnection sendSynchronousRequest:theRequest
                                         returningResponse:&theResponse 
                                                     error:&theError];
    //This works great!
});

と の間に違いはNSMutableURLRequestありNSURLRequestますか? または、NSURLConnection間違った方法で使用しますか?

ありがとう!

4

1 に答える 1

2

ある場所で可変接続を使用しているのではなく、現在のスレッドですぐに実行される同期リクエストメソッドを呼び出しているのに対し、動作するために実行ループを必要とする非同期メソッドを呼び出しているのです。-[NSURLConnection start]のドキュメントから:

このメソッドを呼び出す前に実行ループまたは操作キューで接続をスケジュールしない場合、接続はデフォルトモードの現在の実行ループでスケジュールされます。

バックグラウンドスレッドのブロックから非同期メソッドを呼び出すことは冗長です。メインスレッドでasyncメソッドを呼び出すか(すぐに戻り、バックグラウンドで作業をスケジュールします)、または非同期ディスパッチブロックで同期メソッドを呼び出す必要があります。2番目の方法では、すべてのデリゲートコールバックを処理する必要はありませんが、ロード操作の制御を放棄します。

于 2012-03-02T04:28:44.857 に答える