2

Ich bin ziemlich neu in iOS-Entwicklung und ich versuche, Inhalt von einer URL zu erhalten. Ich benutze das Apple-Tutorial für die Verwendung von NSURLConnection, alles funktioniert, aber ich bekomme keine Daten. Ich habe mich umgesehen und konnte keine Antwort auf mein Problem finden. Ich verwende ARC auch in meinem Projekt, vielleicht verursacht das das Problem? HierNSURLConnection mit ARC empfangen keine Daten

ist der Code, ich verwende, beginnend mit meiner Header-Datei:

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

Implementierungsdatei:

@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]); 
} 

Alle NSLog arbeiten, aber es sagt immer receivedData hat 0 Byte . Ich konnte keine Antwort auf mein Problem finden, also hoffe ich, dass ich meine Antwort mit dieser Frage finden kann.

+0

ARC sollte nicht für automatische Referenzzählung verwendet werden, bitte lesen Sie das Tag-Wiki. –

+0

Es tut mir leid, dass –

+0

Lars, für ARC-Code, Ihre '@ Eigenschaft' sollte 'strong' anstelle von' retain' verwenden. Warum haben Sie auch keine Log-Anweisung in Ihrer '-connection: didReceiveData:' Methode? Andrew – adonoho

Antwort

-1

Sie müssen die Verbindung starten.

Sie könnten zum Beispiel – initWithRequest:delegate:startImmediately: verwenden.

Eine noch kleinere Änderungen an Ihrem vorhandenen Code wäre nur - start auf dem, wenn Zweig auf Ihre Verbindung verwenden:

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"); 
} 

Sie können das Referenzhandbuch für NSURLConnection finden here

+0

Nein, das ist falsch, es ist nicht nötig, den Start zu starten. Wie im Handbuch erwähnt, mit dem Sie verlinkt haben: "Dies entspricht dem Aufruf von initWithRequest: delegate: startImmediately: und übergibt JA für startImmediately." –

+0

Ich stimme zu, es ist nicht notwendig, den Start nur dann aufzurufen, wenn Sie die lange Version des Initialisierers verwenden und JA für startImmediately übergeben. Für eine kleine Änderung des bestehenden Codes bot ich eine zweite Option an. In der Tat habe ich im Beispiel einen Tippfehler. Bearbeitet, um es zu beheben. –

+0

Nein, was ich sage ist, dass, wenn Sie '[[NSURLConnection alloc] initWithRequest: Request Delegate: self];' wie er ist, ist es nicht notwendig, 'start' aufzurufen. Wenn Sie den kürzeren Initialisierer verwenden, wird automatisch die längere Version mit YES als startImmediately aufgerufen. Ich benutze NSURLConnection ausgiebig in meinem Code, benutze immer den kürzeren Initialisierer und rufe nie den Start an. Es funktioniert so und wird in der Dokumentation bestätigt, die Sie verlinkt haben. Auch nach seiner Frage werden seine Delegiertenmethoden aufgerufen, so dass die Verbindung offensichtlich beginnt. –

0

ich die übersetzt Verwenden von NSURLConnection Teil der URL Loading System Programming Guide mit ARC.

// 
// 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

Nur aus Gründen der Fertigstellung. Ich hatte das gleiche Problem, mit Ursache in Threading. Wenn der Thread, der das Objekt NSURLConnection besitzt, sich von dem Thread unterscheidet, dem delegate gehört, wird delegate keine Benachrichtigungen erhalten. Das bedeutet, dass der Verbindungsfehler auch weg wäre.

Stellen Sie also sicher, dass Sie NSURLConnection für denselben Thread erstellen, den Sie für den Delegaten erstellt haben.

Verwandte Themen