-dataWithContentsOfURL:NSData在后台线程中工作吗?

时间:2010-06-20 09:30:15

标签: iphone nsdata

-dataWithContentsOfURL:NSData在后台线程中工作吗?

7 个答案:

答案 0 :(得分:15)

不,它没有。

为了异步从URL获取数据,您应该使用NSURLRequestNSURLConnection方法。

您必须实施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