0

NSOPeration内でバックグラウンドモードの非同期NSURLConnectionを使用する必要があります。これは、応答に大きなデータがあるためです。didEnterBackgroundで使用するAppleの有限長コーディングを回避する必要があります。代わりに、NSInvocationを使用してNSOperationを介して次のコードを使用しますが、機能しません。 connectToServerはNSURLConnection操作を行っています。助けてください?didReceiveData、didReceiveResponseデリゲートメソッドが呼び出されていませんか?

 -(void)viewDidLoad
 {
 NSOperationQueue *queue = [NSOperationQueue new];

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

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

}

 -(void)connectServer
{


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

2

mmmm たぶん、これを使用してメイン キューのブロック内で接続を行うことができます。

dispatch_async(dispatch_get_main_queue(), ^{

        NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0];
        _connection = [[NSURLConnection alloc] initWithRequest:request startImmediately:YES];
        [request release];
});

その後、デリゲート メソッドが呼び出されます。

于 2012-02-15T01:13:51.540 に答える
1

セカンダリスレッドでNSURLConnectionを実行する場合は常に、その接続をrunloopsに追加する必要があります。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url 
                cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0];
    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self
                 startImmediately:YES];
    [request release];


[_connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_connection start];

    [pool release];
于 2012-02-10T11:13:10.213 に答える
0

私はこれについて間違っているかもしれませんが、それでも試してみます...

docs say... for startmethodを参照してください

start 接続がまだデータをロードしていない場合は、データのロードを開始します。

  • (void)start 説明 このメソッドを呼び出す必要があるのは、initWithRequest:delegate:startImmediately: メソッドで接続を作成し、startImmediately パラメータに NO を指定した場合のみです。このメソッドを呼び出す前に実行ループまたは操作キューで接続をスケジュールしない場合、接続はデフォルト モードの現在の実行ループでスケジュールされます。

そのため、操作キュー内にあるため、手動で接続を開始する必要があるようです。私が間違っている場合は修正してください。

于 2012-02-10T10:50:14.930 に答える