-dataWithContentsOfURL:NSData在后台线程中工作吗?
答案 0 :(得分:15)
不,它没有。
为了异步从URL获取数据,您应该使用NSURLRequest
和NSURLConnection
方法。
您必须实施NSURLConnectionDelegate
方法:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
-(void)connectionDidFinishLoading:(NSURLConnection *)connection;
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
答案 1 :(得分:8)
我在后台线程中使用dataWithContentsOfURL。
-(void)loaddata {
NSData* data = [NSData dataWithContentsOfURL:@"some url"];
if (data == nil) {
DLog(@"Could not load data from url: %@", url);
return;
}
}
从主线程中调用类似的东西。
[self performSelectorInBackground:@selector(loaddata) withObject:nil];
如果要在loaddata结束时对ui执行更新,请务必在主线程上调用函数。
答案 2 :(得分:5)
没有。不过,您可以使用NSURLSession。
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSString *imageURL = @"Direct link to your download";
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionDownloadTask *getImageTask = [session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *downloadedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]];
});
}];
[getImageTask resume];
答案 3 :(得分:4)
不,它会阻止当前线程。
您需要使用NSURLConnection
才能拥有异步请求。
答案 4 :(得分:3)
你也可以使用-dataWithContentsOfURL + NSOperation + NSOperationQueue
答案 5 :(得分:1)
我猜这多年来已经发生了一些变化。但是,这些天,
NSURLRequest* request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
}];
会给你一个异步网络电话。
答案 6 :(得分:0)
不,这将阻止线程,您将文件的内容加载到RAM中。您可以直接将内容下载到文件中而无需临时NSData,以避免大量使用RAM。像这个解决方案https://stackoverflow.com/a/6215458/2937913