¿Cómo get datos de bloques usando NSURLSession?

Tengo un problema con este bloque. NSURLSession get los datos dentro del bloque de NSURLSession .

aquí está mi código

 -(NSDictionary *) RetrieveData{ NSURLSession * session = [NSURLSession shanetworkingSession]; NSURL * url = [NSURL URLWithString: self.getURL]; dataList =[[NSDictionary alloc] init]; NSURLSessionDataTask * dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { self.json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; }]; return self.dataList; [dataTask resume]; } 

¿Es posible get los datos dentro de los bloques de NSURLSession ?

 -(void)getJsonResponse:(NSString *)urlStr success:(void (^)(NSDictionary *responseDict))success failure:(void(^)(NSError* error))failure { NSURLSession *session = [NSURLSession shanetworkingSession]; NSURL *url = [NSURL URLWithString:urlStr]; // Asynchronously API is hit here NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@",data); if (error) failure(error); else { NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"%@",json); success(json); } }]; [dataTask resume]; // Executed First } 

llamar a esto:

 [self getJsonResponse:@"Enter your url here" success:^(NSDictionary *responseDict) { NSLog(@"%@",responseDict); } failure:^(NSError *error) { // error handling here ... }]; 

Debe usar un bloque de finalización, por ejemplo:

 - (void)retrieveData:(void (^)(NSDictionary * dictionary))completionHandler { NSURLSession *session = [NSURLSession shanetworkingSession]; NSURL *url = [NSURL URLWithString: self.getURL]; NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; if (completionHandler) { completionHandler(dictionary); } }]; [dataTask resume]; } 

Entonces el método que llama esto haría:

 [self retrieveData:^(NSDictionary *dictionary) { // you can use the dictionary here // if you want to update UI or model, dispatch this to the main queue: dispatch_async(dispatch_get_main_queue(), ^{ // do your UI stuff here }); }]; // but dont try to use the dictionary here, because you will likely // hit this line before the above block fires off, and thus the // dictionary hasn't been returned yet! 

Está llamando a un método asíncrono que emplea un patrón de bloque de finalización, por lo que también debe emplear el patrón de bloque de finalización en su propio código.

Tendrás que ponerte al stream de este método. Es mejor cambiar el nombre de su método de RetrieveData (está violando las convenciones de nomenclatura de Cocoa aquí) para iniciarRetrievingData. No puede escribir un método que realmente recupere los datos, ya que eso puede llevar minutos en el peor de los casos y sus usuarios lo odiarán.

Llame a startRetrievingData, hágalo regresar y pase dos bloques, cuando se llamará en el futuro cuando los datos hayan sido recuperados, y uno que se llamará en el futuro cuando haya ocurrido un error y no pueda get los datos.

No puede devolver los datos. No preguntes "cómo devuelvo los datos", simplemente no puedes. Le das al código un bloque que se llama cuando hay datos disponibles, y ese bloque es responsable de hacer con los datos lo que quieras hacer con él.

 NSURLSession *session = [NSURLSession shanetworkingSession]; NSURL *url = [NSURL URLWithString:@"http://www.code-brew.com/projects/Instamigos/api/login.php?instagram_id=572275360&access_token=572275360.4c70214.57e0ecb1113948c2b962646416cc0a18&name=dpak_29&uuid=ios_1"]; // Asynchronously API is hit here NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@",data); // Executed when the response comes from server // Handle Response here NSDictionary * json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"%@",json); }]; [dataTask resume]; // Executed First