2012-07-23 12 views
6

ho tentato di fare - [NSString stringWithContentsOfURL: encoding: errore:] asincrono, eseguendo un-sincronicamente da un thread in background:Rendere stringWithContentsOfURL asincrono - È sicuro?

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

il suo bel lavoro, e, soprattutto, la sua asincrono.

La mia domanda è se è sicuro farlo, o potrebbero esserci problemi di threading ecc.?

Grazie in anticipo :)

risposta

27

che dovrebbe essere al sicuro, ma perché reinventare la ruota?

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

evviva! Non sapevo che fosse possibile: P – JonasG

+0

Prima di tutto, però, funzionerà sulla coda principale a causa di '[NSOperationQueue mainQueue]', ma ho visto 'sendAsynchronousRequest'. Quindi questo non dovrebbe impedire all'interfaccia utente di aggiornarsi. –

0

è anche possibile utilizzare:

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

Ma sì, si dovrebbe essere al sicuro. Tuttavia, mi è stato detto di utilizzare NSURLConnection a causa di chiamate di errore e simili durante la comunicazione via Internet. Sto ancora facendo ricerche su questo.

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