2012-04-18 4 views
0

私はNSURLConnectionDelegate connection:didReceiveData not workingを見てきましたが、それで良い結果は出ていないようですので、データが得られない理由が不思議です。NSUrlConnectionDelegateがデータをロードするメソッドを呼び出さない

didReceiveResponsedidReceiveDataにブレークポイントを設定しました。

「接続に成功しました」というメッセージが表示されるので、接続が開始されていることがわかります。

私はメモリ管理にARCを使用しています。

- (void)load { 
     request = [NSMutableURLRequest requestWithURL:myURL 
                  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
                 timeoutInterval:60]; 

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if (conn) { 
     [conn start]; 
     NSLog(@"connection succeeded, %s", [myURL description]); 
     responseData = [NSMutableData data]; 
    } else { 
     NSLog(@"connection failed"); 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    responseData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [responseData appendData:data]; 
} 

UPDATE:

私はAsynchronous unit test not being called by SenTestCaseでこの外観をテストする方法を確認するには。

私はjonkrollで述べた2つの方法を実装しましたが、彼の答えでは表示していませんでしたが、呼び出されていません。

私は[conn start]を追加しました。これは動作していなかっただけなので、私はそれが解決できると思っていましたが、そのような運がありません。

答えて

3

あなたはこのようなあなたの接続宣言:

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

あなたは地元のポインタを作成しているが。メソッドが完了すると、それはNSURLConnectionへの最後の強い参照であったため、ARCはそれを解放します。作成するNSURLConnectionへの強い参照を保持するには、強力なivar(および/または)プロパティを使用する必要があります。

編集

ここで私は、サンプルプロジェクトでテストコードの基本的なサンプルがあります。それを実行してください。詳細ログは役立ちます。

@implementation <#Your class here#> { 
    // With ARC ivars are strong by default 
    NSMutableData *_downloadedData; 
    NSURLConnection *_connection; 
} 
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    NSHTTPURLResponse *realResponse = (NSHTTPURLResponse *)response; 
    if (realResponse.statusCode == 200){ 
     // Really any 2** but for example 
     _downloadedData = [[NSMutableData alloc] init]; 
     NSLog(@"Good response"); 
    } else { 
     NSLog(@"Bad response = %i",realResponse.statusCode); 
    } 
} 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    if (connection == _connection){ 
     [_downloadedData appendData:data]; 
     NSLog(@"Getting data..."); 
    } 
} 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    if (connection == _connection){ 
     _connection = nil; 
     NSLog(@"We're done, inform the UI or the delegates"); 
    } 
} 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    _connection = nil; 
    NSLog(@"Oh no! Error:%@",error.localizedDescription); 
} 
- (void)load { 
    NSURL *url = [NSURL URLWithString:@"http://www.google.com/"]; 
    NSURLRequest *request = [NSMutableURLRequest requestWithURL:url 
             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
            timeoutInterval:60]; 
    // Assign strong pointer to new connection 
    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    NSLog(@"Connection was initialized? = %@",(!!_connection)[email protected]"YES":@"NO"); 
} 
@end 
+0

私はこのようにconnを変更しました:@property NSURLConnection * conn;しかし、私は同じ結果を得て、データは受け取られません。 90秒をちょっと待ってから私の単体テストは待つことなく停止します。 –

+0

@JamesBlackテスト済みのサンプルコードをいくつか追加しました。 – NJones

+0

まだ違いはわかりませんが、あなたのおかげで今働いています。 –

0

NSURLConnectionメソッドinitWithRequestは、URLからのデータの非同期要求を開始します。要求は非同期で行われるため、要求が呼び出されたのと同じ方法で応答を処理することは期待できません。代わりに、NSURLConnectionのデリゲートコールバックメソッドでそうする必要があります。あなたはすでにdidReceiveResponse:didReceiveData:を実装していますが、あなたに役立ついくつかの他のものがあります。

あなたはあなたのコードのプリントアウトは、「接続に成功しました」本当に要求が成功したことを意味するものではありませんようにconnectionDidFinishLoading:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // response is complete, do something with the data 
    NSLog(@"%@", responseData); 
} 

実際に行う必要があり、応答の内容を見たい場合は、 NSURLConnectionオブジェクトが正常に作成されたことだけです。接続に問題があったかどうかをテストするには、また[conn start]を呼び出す必要はありませんデリゲートメソッドconnection:didFailWithError:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"Connection failed! Error - %@ %@", 
      [error localizedDescription], 
      [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
} 

に実装することができます。電話を受けると自動的にリクエストが開始されますinitWithRequest:

詳細については、AppleのドキュメントUsing NSURLConnectionをお読みください。

+0

ありがとう。私はそれが機能していなかったので、[conn start]を追加しました。私は他の方法も実装しましたが、私の伐採によれば、何もしていないようです。 –