2012-03-23 47 views
3

我目前使用此代碼從一個URL數據: NSURL *url = [[NSURL alloc] initWithString:urlstring]; NSString *stringfromFB = [[NSString alloc] initWithContentsOfURL:url];異步獲取數據,而不是使用initWithContentsOfURL

我不知道我怎麼會異步地收集這些數據,以便我的應用程序也不會凍結,每次我需要執行此操作。謝謝!

回答

0
// Do not alloc init URL obj. for local use. 
NSString *urlString = @"put your url string here"; 

NSURL *url = [NSURL URLWithString:urlString]; 

NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease]; 


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

上述委託方法是NSURLConnectionDelegate,你需要處理像響應誤差等所有的東西。它是由提供的,所以我們可以默認直接覆蓋它,而不

我有一次用在我的項目它將爲異步請求工作,但如果你接收到的圖像的數量,以及隨後還用IconDownloaderEGOImageView它實現了圖像的延遲加載,並使應用程序凍結的可能性很低。

0

如果您不想等待連接完成加載url,則可以使用NSURLConnection異步加載它。

[NSURLConnection connectionWithRequest: 
    [NSURLRequest requestWithURL: 
    [NSURL URLWithString:yourUrlString]] 
    delegate:self]; 
8

最簡單的方法是提供OS5這樣的:

NSString *stringfromFB; 
NSURL *url = [[NSURL alloc] initWithString:urlstring]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    if (data) { 
     stringfromFB = [[NSString alloc] initWithData:data 
              encoding:NSUTF8StringEncoding]; // note the retain count here. 
    } else { 
     // handle error 
    } 
}]; 

如果你被困在OS < 5出於某種原因,你需要開始一個代表您的連接,實施代表協議as illustrated here(以及其他地方的許多地方)。

+0

上面的例子在結尾處缺少a],但是除此之外真是太神奇了!謝謝! – ripegooseberry 2012-10-26 06:45:24

4

你可以用GCD做到這一點:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    NSURL *url = [[NSURL alloc] initWithString:urlstring]; 
    NSString *stringfromFB = [[NSString alloc] initWithContentsOfURL:url] 
}); 
+0

GCD會自動爲您執行多線程嗎?對不起,如果簡單的問題,我還沒有經驗。謝謝!如果您使用dispatch_async和dispatch_get_global_queue,則爲 – 2012-03-24 03:00:51

+0

。它是TASK PARALELISM的一個實現,非常易於使用且功能非常強大(支持多核)。你可以閱讀它:http://en.wikipedia.org/wiki/Grand_Central_Dispatch和https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html。永遠是我在iOS平臺上的首選。 – LuisEspinoza 2012-03-25 00:00:23

0

現在NSURLConnection已被棄用,您需要使用NSURLSession。

NSURLSession *session = [NSURLSession sharedSession]; 

NSURLSessionDataTask *task = [session dataTaskWithRequest: request 
             completionHandler: ^(NSData *data, NSURLResponse *response, NSError *networkError) { 

      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 

      if ([httpResponse statusCode] == STATUS_OK) { 
       // use data      
      } 
      else { 
       NSLog(@"Network Session Error: %@", [networkError localizedFailureReason]); 
      } 
}]; 

[task resume];