我目前使用此代碼從一個URL數據: NSURL *url = [[NSURL alloc] initWithString:urlstring]; NSString *stringfromFB = [[NSString alloc] initWithContentsOfURL:url];
異步獲取數據,而不是使用initWithContentsOfURL
我不知道我怎麼會異步地收集這些數據,以便我的應用程序也不會凍結,每次我需要執行此操作。謝謝!
我目前使用此代碼從一個URL數據: NSURL *url = [[NSURL alloc] initWithString:urlstring]; NSString *stringfromFB = [[NSString alloc] initWithContentsOfURL:url];
異步獲取數據,而不是使用initWithContentsOfURL
我不知道我怎麼會異步地收集這些數據,以便我的應用程序也不會凍結,每次我需要執行此操作。謝謝!
// 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,你需要處理像響應誤差等所有的東西。它是由提供的,所以我們可以默認直接覆蓋它,而不
我有一次用在我的項目它將爲異步請求工作,但如果你接收到的圖像的數量,以及隨後還用IconDownloader或EGOImageView它實現了圖像的延遲加載,並使應用程序凍結的可能性很低。
如果您不想等待連接完成加載url,則可以使用NSURLConnection異步加載它。
[NSURLConnection connectionWithRequest:
[NSURLRequest requestWithURL:
[NSURL URLWithString:yourUrlString]]
delegate:self];
最簡單的方法是提供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(以及其他地方的許多地方)。
你可以用GCD做到這一點:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSURL *url = [[NSURL alloc] initWithString:urlstring];
NSString *stringfromFB = [[NSString alloc] initWithContentsOfURL:url]
});
GCD會自動爲您執行多線程嗎?對不起,如果簡單的問題,我還沒有經驗。謝謝!如果您使用dispatch_async和dispatch_get_global_queue,則爲 – 2012-03-24 03:00:51
。它是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
現在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];
上面的例子在結尾處缺少a],但是除此之外真是太神奇了!謝謝! – ripegooseberry 2012-10-26 06:45:24