/* * This file is part of the SDWebImage package. * (c) Olivier Poitrey * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ #import "SDWebImageDownloader.h" @interface SDWebImageDownloader () @property (nonatomic, retain) NSURLConnection *connection; @property (nonatomic, retain) NSMutableData *imageData; @end @implementation SDWebImageDownloader @synthesize url, delegate, connection, imageData; #pragma mark Public Methods + (id)downloaderWithURL:(NSURL *)url delegate:(id)delegate { SDWebImageDownloader *downloader = [[[SDWebImageDownloader alloc] init] autorelease]; downloader.url = url; downloader.delegate = delegate; [downloader performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:YES]; return downloader; } + (void)setMaxConcurrentDownloads:(NSUInteger)max { // NOOP } - (void)start { // In order to prevent from potential duplicate caching (NSURLCache + SDImageCache) we disable the cache for image requests NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15]; self.connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO] autorelease]; // Ensure we aren't blocked by UI manipulations (default runloop mode for NSURLConnection is NSEventTrackingRunLoopMode) [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [connection start]; [request release]; if (connection) { self.imageData = [NSMutableData data]; } else { if ([delegate respondsToSelector:@selector(imageDownloader:didFailWithError:)]) { [delegate performSelector:@selector(imageDownloader:didFailWithError:) withObject:self withObject:nil]; } } } - (void)cancel { if (connection) { [connection cancel]; self.connection = nil; } } #pragma mark NSURLConnection (delegate) - (void)connection:(NSURLConnection *)aConnection didReceiveData:(NSData *)data { [imageData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection { UIImage *image = [[UIImage alloc] initWithData:imageData]; self.imageData = nil; self.connection = nil; if ([delegate respondsToSelector:@selector(imageDownloader:didFinishWithImage:)]) { [delegate performSelector:@selector(imageDownloader:didFinishWithImage:) withObject:self withObject:image]; } [image release]; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { if ([delegate respondsToSelector:@selector(imageDownloader:didFailWithError:)]) { [delegate performSelector:@selector(imageDownloader:didFailWithError:) withObject:self withObject:error]; } self.connection = nil; self.imageData = nil; } #pragma mark NSObject - (void)dealloc { [url release], url = nil; [connection release], connection = nil; [imageData release], imageData = nil; [super dealloc]; } @end