2016-06-03 18 views
0

I subclassed haben ein NSData Objekt in meinem .h und .m-Dateien wie folgt:Erste Daten aus einer NSURLConnection POST-Methode

@interface Test : NSData // and so forth 

ich eine Funktion erstellt haben, die JSON Daten senden an den Server zurück erzeugt als a POST. Ich erhalte in dem Code zu diesem Teil:

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

Frage 1:

Wie kann ich feststellen, wenn die Verbindung/Post erledigt ist? Ist es im If/Else unten?

if(conn) { 
    NSLog(@"Connection Successful"); 
} else { 
    NSLog(@"Connection could not be made"); 
} 

Frage 2:

Wie verwende ich diese Delegatmethoden unter den Daten zu erhalten, die zurückgegeben wird?

// This method is used to receive the data which we get using post method. 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data 

// This method receives the error report in case of connection is not made to server. 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 

// This method is used to process the data after connection has made successfully. 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
+0

BTW, wenn Sie 'NSURLSession' verwenden, können Sie die Einfachheit der blockbasierten Abschluss-Handler (Art wie' NSURLConnection' des 'sendAsynchronousRequest' ... keine Delegatmethoden genießen wäre es, wenn Sie sich Sorgen zu machen don will nicht), aber (a) es ist kündbar; und (b) Sie vermeiden die Verwendung der nun veralteten 'NSURLConnection'. – Rob

+0

Auch ich bin mir nicht sicher, warum Sie die Unterklasse 'NSData' machen würden. Das ist im Allgemeinen unnötig. Normalerweise würden Sie nur 'NSMutableData' verwenden. – Rob

+0

@Rob danke. Ja, ich werde NSURLSession verwenden. Sollte überprüft haben, ob es zuerst veraltet war. – cdub

Antwort

1

Sie müssen Delegate-Methoden für die Verifizierung des Operationserfolgs verwenden und die Daten in zurückgegeben werden.

- (void)connection:(NSURLConnection *)connection 
didReceiveResponse:(NSURLResponse *)response 
{ 
    NSLog("@Resp received"); 
    return; 
} 

- (void)connection:(NSURLConnection *)connection 
    didReceiveData:(NSData *)data 
{ 
    NSLog("@Data received"); 
    return 
} 

- (void)connection:(NSURLConnection *)connection 
    didFailWithError:(NSError *)error 
{ 
    NSLog("@ERROR: Achtung !: %@",[error localizedDescription]); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH , 0),, ^{ 
     NSLog(@"FinishedLoading: In bg thread, do something with data here"); 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"FinishedLoading: In Main thread, access the UI here"); 
     }); 
    }); 
} 
+0

Gibt ich die Daten von didRecieveData zurück wie [_theData appendData]; und dann _theData in meiner if (conn) Schleife verwenden? – cdub

+0

@cdub - Ja, 'didReceiveData' sollte an' NSMutableData' angehängt werden, aber Sie verarbeiten es in 'connectionDidFinishLoading', nicht dort, wo Sie' NSURLConnection' instanziiert haben. – Rob

1

dies funktionierte für mich

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"API link"] 

NSLog(@"%@",url.standardizedURL); 
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, 
              NSData *data, NSError *connectionError) 
{ 
    NSLog(@"balh %@",connectionError); 
    if (data.length > 0 && connectionError == nil) 
    { 
     NSDictionary *response = [NSJSONSerialization JSONObjectWithData:data 
                    options:0 
                    error:NULL]; 
     NSString * string = [[NSString alloc] initWithData:data encoding:NSStringEncodingConversionAllowLossy]; 
     NSLog(@"%@ %@",response,string); 



     [self dismissViewControllerAnimated:YES completion:^{ 

     }]; 
    } 
}]; 

zum Anschluss Überprüfung Sie diese Aussagen nach NSURLConnection Anweisung

if(response){NSLog(@"Connection Established");}else{NSLog(@"Connection not established");} 
0

Set HTTP-Methode (POST oder GET) verwenden können. Schreiben Sie diese Zeilen so, wie sie in Ihrem Code sind.

[request setHTTPMethod:@"POST"];