objective-c ios asynchronous thread-safety http-request

objective c - Hacer stringWithContentsOfURL asincrónico: ¿es seguro?



objective-c ios (3)

Eso debería ser seguro, pero ¿por qué reinventar la rueda?

NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]; [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; // etc }];

Intenté hacer - [NSString stringWithContentsOfURL: encoding: error:] asincrónico, ejecutándolo sincrónicamente desde un hilo de fondo:

__block NSString *result; dispatch_queue_t currentQueue = dispatch_get_current_queue(); void (^doneBlock)(void) = ^{ printf("done! %s",[result UTF8String]); }; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) { result = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com/"] encoding:NSUTF8StringEncoding error:nil]; dispatch_sync(currentQueue, ^{ doneBlock(); }); });

Está funcionando bien, y lo más importante, es asincrónico.

Mi pregunta es si es seguro hacer esto, ¿o podría haber problemas de subprocesos, etc.?

Gracias por adelantado :)


También puedes usar:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ NSError *error = nil; NSString *searchResultString = [NSString stringWithContentsOfURL:[NSURL URLWithString:searchURL] encoding:NSUTF8StringEncoding error:&error]; if (error != nil) { completionBlock(term,nil,error); } else { // Parse the JSON Response NSData *jsonData = [searchResultString dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *searchResultsDict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]; if(error != nil) { completionBlock(term,nil,error); } else { //Other Work here } } });

Pero sí, debería ser seguro. Sin embargo, me han dicho que use NSURLConnection debido a llamadas de error y tal cuando se comunican a través de Internet. Todavía estoy investigando esto.


-(void)loadappdetails:(NSString*)appid { NSString* searchurl = [@"https://itunes.apple.com/lookup?id=" stringByAppendingString:appid]; [self performSelectorInBackground:@selector(asyncload:) withObject:searchurl]; } -(void)asyncload:(NSString*)searchurl { NSURL* url = [NSURL URLWithString:searchurl]; NSError* error = nil; NSString* str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; if (error != nil) { NSLog(@"Error: %@", error); } NSLog(@"str: %@", str); }