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