14

応答に多くのデータがあるため、バックグラウンドモードで実行したいと思いNSURLConnection ます。フォーラムでは、で使用するためにAppleの有限長コーディングを使用するように指示されていますdidEnterBackground。しかし、私はそれを避けたいと思います。その代わりに、次のコードをNSOperationasNSInvocationで使用しますが、機能していません。connectToServer操作中ですNSURLConnection。助けてください。didReceiveDatadidReceiveResponseデリゲートメソッドは呼び出されませんか?

 NSOperationQueue *queue = [NSOperationQueue new];

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(connectToServer)
                                                                          object:nil];

[queue addOperation:operation];
[operation release];
[queue autorelease];

 -(void)connectToServer
{
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSURLConnection *theConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self] autorelease];

    if( theConnection )
    {
        webData = [[NSMutableData data] retain];
    }
    else
    {
        NSLog(@"theConnection is NULL");
    }
}
4

3 に答える 3

42

この種の質問は何億回も聞かれました。iOS 4の時点では、セカンダリスレッドで操作が開始されているため、デリゲートは呼び出されません。デリゲートが呼び出される前にスレッドが終了する可能性があります。

メインスレッドで接続を維持し、GCDを使用してバックグラウンドスレッドでデータを処理します。

私はここにこれらすべてのものについて書きました:http://cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/

編集:更新されたリンク。

于 2012-02-13T13:51:49.140 に答える
6

Appleは、単一のリクエストに対して、QHTTPOperationあなたが望むことを実行し、NSURLConnection内にカプセル化するを提供します。AppleのサンプルコードNSOperationで見つけることができます。

QHTTPOperationは実際にはそのサブクラスでQRunLoopOperationあり、NSOperationの実行ループコールバックに依存するロジックをカプセル化できます。

サードパーティASIHTTPRequestも同様の人気のあるソリューションですが、AFAIKはもうメンテナンスされていません。

于 2012-02-19T21:19:06.630 に答える
0

ここAppleのドキュメントに記載されているsendAsynchronousRequest:queue:completionHandler:メソッドを見てください。NSURLConnectionを使用した非同期リクエストを許可します。

これにはiOS5以降が必要であることに注意してください

于 2012-02-10T06:34:04.513 に答える