2

私はiOS開発が新しく、URLからコンテンツを取得しようとしています。私はNSURLConnectionを使用するためのAppleチュートリアルを使用していますが、すべて動作していますが、私はデータを取得していません。私は周りを見回して、私の問題に対する答えを見つけることができませんでした。プロジェクトでARCも使用していますが、問題が発生する可能性があります。NSURL ARCとの接続でデータが受信されない

@interface ViewController : UIViewController 
@property (nonatomic, retain) NSMutableData *receivedData; 
@end 

実装ファイル:

@implementation ViewController 

@synthesize receivedData; 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"1. viewDidLoad"); 
    // Create the request 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
    // Create the connection with the request and start loading the data 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if (connection) { 
     NSLog(@"2. connection succeeded"); 
     receivedData = [NSMutableData data]; 
    } else { 
     NSLog(@"2. connection failed"); 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse  *)response 
{ 
    NSLog(@"3. didReceiveResponse"); 
    [receivedData setLength:0]; 
} 

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

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

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"4. Succeeded! Received %d bytes of data", [receivedData length]); 
} 

すべてのNSLog取り組んでいるが、それはreceivedDataが0バイトであると言って続けてここ

は、私は私のヘッダファイルで始まる、使用しているコードがあります。私は自分の問題に対する答えを見つけることができなかったので、私はこの質問で私の答えを見つけることができれば幸いです。

+0

自動参照カウントにARCを使用しないでください。タグwikiを読んでください。 –

+0

それは申し訳ありません –

+0

Lars、ARCコードでは、 '@ property'は' retain'の代わりに 'strong'を使うべきです。また、なぜ '-connection:didReceiveData:'メソッドにログステートメントがないのですか? Andrew – adonoho

答えて

-1

接続を開始する必要があります。

たとえば、– initWithRequest:delegate:startImmediately:を使用できます。

アン既存のコードにさらに小さな変更があるかの枝にあなたの接続で- startを使用することです:

NSURLConnection *connection = [[NSURLConnection alloc] 
           initWithRequest:request 
             delegate:self 
           startImmediately:NO 
           ]; 
if (connection) { 
    NSLog(@"2. connection succeeded"); 
    receivedData = [NSMutableData data]; 
    [connection start]; 
} else { 
    NSLog(@"2. connection failed"); 
} 

あなたは、私が翻訳したNSURLConnection here

+0

これは間違っていますが、startを呼び出す必要はありません。あなたがリンクしているマニュアルで述べたように、「これはinitWithRequest:delegate:startImmediatelyを呼び出すのと同じです。そして、startImmediatelyにYESを渡します。 –

+0

私は、初期化子の長いバージョンを使用し、startImmediatelyに対してYESを渡す場合にのみ、startを呼び出す必要はないと同意します。既存のコードに少し変更を加えるために、私は第2の選択肢を提供しました。実際、私はこの例でタイプミスをしています。それを修正するために編集しました。 –

+0

私が言っていることは、 '[[NSURLConnection alloc] initWithRequest:delegate:self];を使うとき、' start'を呼び出す必要がないということです。より短いイニシャライザを使用すると、startImmediatelyとしてYESを指定したより長いバージョンが自動的に呼び出されます。 NSURLConnectionをコード内で広く使用し、常に短い初期化子を使用し、startを呼び出さないようにします。この方法で動作し、リンク先のドキュメントで確認されます。また、彼の質問によれば、デリゲートメソッドが呼び出されているので、接続が開始されていることは明らかです。 –

0

のリファレンスマニュアルを見つけることができますARCを使用してURL Loading System Programming GuideのNSURLConnectionの一部を使用します。

// 
// MyConnection.h 
// 

#import <Foundation/Foundation.h> 

@interface MyConnection : NSObject 

- (void)start; 

@property NSMutableData *receivedData; 

@end 


// 
// MyConnection.m 
// 

#import "MyConnection.h" 

@implementation MyConnection 

- (void)start { 

    // Create the request 
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 

    // Create the connection with the request and start loading the data 
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

    if (theConnection) { 
     // Create the NSMUtableData to fold the received data 
     // ReceivedData is an instance variable declared elsewhere 
     _receivedData = [NSMutableData data]; 

    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [_receivedData setLength:0]; 
} 

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    // Inform the user 
    NSLog(@"Connectionfailed! Error - %@ %@", 
      [error localizedDescription], 
      [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // Do something with the data 
    NSLog(@"Succeeded! Recevied %d bytes of data", [_receivedData length]); 

} 

@end 
0

完了のためだけです。私はスレッドの原因と同じ問題を抱えています。 NSURLConnectionオブジェクトを所有するスレッドがdelegateを所有するスレッドと異なる場合、delegateは通知を受け取りません。つまり、接続のエラーもなくなります。

したがって、デリゲートを作成したのと同じスレッドにNSURLConnectionを作成してください。

関連する問題