dontWatchMyProfile
dontWatchMyProfile

Reputation: 46370

Does -dataWithContentsOfURL: of NSData work in a background thread?

Does -dataWithContentsOfURL: of NSData work in a background thread?

Upvotes: 13

Views: 15471

Answers (7)

Nipuna H Herath
Nipuna H Herath

Reputation: 101

No. You can use NSURLSession instead, though.

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];

Upvotes: 7

Michael Kessler
Michael Kessler

Reputation: 14235

No, it doesn't.

In order to get data from URL asynchronously you should use the NSURLRequest and NSURLConnection approach.

You will have to implement the NSURLConnectionDelegate methods:

-(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;

Upvotes: 15

aepryus
aepryus

Reputation: 4825

I'm guessing this has changed a bit over the years. But, these days,

NSURLRequest* request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
}];

will give you an async network call.

Upvotes: 1

Elensar
Elensar

Reputation: 124

No, this will block the thread and you will load the contents of file into the RAM. You can download content directly into file without temporary NSData to avoid huge RAM usage. Something like this solution https://stackoverflow.com/a/6215458/2937913

Upvotes: 0

Jonny
Jonny

Reputation: 16328

I'm using dataWithContentsOfURL in a background thread fine.

-(void)loaddata {
    NSData* data = [NSData dataWithContentsOfURL:@"some url"];
    if (data == nil) {
        DLog(@"Could not load data from url: %@", url);
        return;
    }
}

Call something like this from main thread.

[self performSelectorInBackground:@selector(loaddata) withObject:nil];

If you want to perform updates to ui at end of loaddata, be sure to call a function on main thread.

Upvotes: 9

berec
berec

Reputation: 785

Also you may use -dataWithContentsOfURL + NSOperation + NSOperationQueue

Upvotes: 3

Jacob Relkin
Jacob Relkin

Reputation: 163288

No, it blocks the current thread.

You need to use NSURLConnection in order to have asynchronous requests.

Upvotes: 4

Related Questions