Creating stringWithContentsOfURL asynchronously - is it safe?

I tried to make [NSString stringWithContentsOfURL: encoding: error:] asynchronous by executing it a-synchronically from the background thread:

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

His work is beautiful and, most importantly, asynchronous.

My question is, is it safe to do this or can there be problems with threads, etc.?

Thanks in advance:)

+6
source share
3 answers

It should be safe, but why reinvent the wheel?

 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 }]; 
+27
source

You can also use:

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

But yes, it should be safe. I was told, however, that use NSURLConnection instead because of errors, etc. When communicating over the Internet. I am still doing this.

0
source
 -(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); } 
0
source

Source: https://habr.com/ru/post/921158/


All Articles