Я начал интенсивно использовать блоки и очереди, и они были великолепны.Я использую гораздо меньше кода, и его гораздо проще создавать и поддерживать.Но меня интересует производительность.В одном случае я показываю экран, полный миниатюрных изображений из набора фотографий Flickr.Код перебирает все элементы и запускает уникальную очередь загрузки для одновременной загрузки каждой фотографии.Он работает просто отлично, но мне интересно, стоит ли мне вместо этого создать единую статическую очередь для загрузки фотографий, а затем отправить эти блоки загрузки в ту же очередь, чтобы она могла эффективно управлять блоками.
Я загрузилпример здесь.
http://www.smallsharptools.com/Downloads/iOS/UIImage+DownloadImage.zip
Содержание реализации также приведено ниже.Я ценю любую информацию о лучшей производительности.(Позже я хотел бы заняться кэшированием изображений, поместив файл в папку tmp, чтобы они периодически периодически очищались.)
Как вы управляете параллельными задачами с блоками?Вы создаете статическую очередь и отправляете блоки в общую очередь?Или реализация ниже неявно управляет всеми моими задачами уже эффективно?
#import "UIImage+DownloadImage.h"
@implementation UIImage (DownloadImage)
+ (void)downloadImageWithURL:(NSURL *)imageURL andBlock:(void (^)(UIImage *image, NSError *error))returnImage {
dispatch_queue_t callerQueue = dispatch_get_current_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("Image Download Queue", NULL);
dispatch_async(downloadQueue, ^{
UIImage *image = nil;
NSError *error = nil;
// use the default cache policy to do the memory/disk caching
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:imageURL
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:15];
NSHTTPURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
// 200 indicates HTTP success
if (response.statusCode != 200) {
data = nil;
// set the error to indicate the request failed
NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat:@"Request failed with HTTP status code of %i", response.statusCode], NSLocalizedDescriptionKey, nil];
error = [NSError errorWithDomain:@"UIImage+DownloadImage" code:response.statusCode userInfo:userInfo];
}
else if (!error && data) {
image = [UIImage imageWithData:data];
}
// image will be nil if the request failed
dispatch_async(callerQueue, ^{
returnImage(image, error);
});
});
dispatch_release(downloadQueue);
}
@end