2012-07-23 1 views
6

내가 만드는 시도 - [있는 NSString stringWithContentsOfURL : 인코딩 : 오류 :] 비동기, 백그라운드 스레드에서 그것에게 - 동 기적을 실행하여 : 비동기식를stringWithContentsOfURL을 비동기로 설정 - 안전합니까?

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

그것을 가장 중요한 것은 잘 작동합니다.

내 질문에이 작업을 수행하는 것이 안전 할 경우 또는 스레딩 문제가있을 수 있습니까? 안전하지만, 왜 바퀴를 재발견해야

답변

27

미리 :)에서

감사합니다?

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

을하지만 네, 안전합니다 :

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

건배! 나는 이것이 가능하다는 것을 몰랐다 : P – JonasG

+0

처음에는 이것이 [NSOperationQueue mainQueue] 때문에 메인 큐에서 작동하지만'sendAsynchronousRequest'를 보았다. 따라서 UI가 업데이트되지 않아야합니다. –

0

당신은 또한 사용할 수 있습니다. 나는 대신 NSURLConnection을 에러 호출과 인터넷을 통해 통신 할 때 사용하기로했다. 나는 아직도 이것에 대한 연구를하고있다.

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