0

NSURLConnectionDelegate connection:didReceiveDataがまだ機能していないことを確認しましたが、それによる良い結果は得られなかったようです。そのため、データを取得できない理由に興味があります。

didReceiveResponseとにブレークポイントを設定しましたdidReceiveData

「接続に成功しました」と出力されるので、接続が開始されたことがわかります。

私はメモリ管理に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];
}

アップデート:

これをどのようにテストするかを確認するには、SenTestCaseによって呼び出されていない非同期ユニットテストを見てください。

私はjonkrollが言及した2つのメソッドを実装しました。彼の答えでは、それらを表示しなかっただけですが、それらも呼び出されていません。

私はそれが機能していなかったという理由だけで追加しまし[conn start]た、そして私はそれがそれを解決するかもしれないことを望んでいました、しかしそのような運はありませんでした。

4

2 に答える 2

3

このように接続を宣言すると、次のようになります。

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

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

編集

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

@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)?@"YES":@"NO");
}
@end
于 2012-04-18T01:49:31.713 に答える
0

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

応答の内容を確認したい場合は、connectionDidFinishLoading:

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

コードが「接続に成功しました」と出力するという事実は、実際にはリクエストが成功したことを意味するのではなく、NSURLConnectionオブジェクトが正常に作成されたことだけを意味します。接続に問題があったかどうかをテストするには、デリゲートメソッドを実装できますconnection:didFailWithError:

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

また、を呼び出す必要はありません[conn start]。電話をかけると、リクエストが自動的に開始されますinitWithRequest:

詳細については、NSURLConnectionの使用に関するAppleのドキュメントを読むことをお勧めします。

于 2012-04-18T01:26:40.950 に答える