Итак, я уже прошел почти все вопросы по SO, и я собрал их все вместе, чтобы создать метод, который принимает два параметра: сначала URL
изображения для загрузки и отображения в UIImageView
и второе - изображение заполнителя для этого UIImageView
. Я хочу сохранить изображение, чтобы он не загружался каждый раз. Я использовал SDWebImage для загрузки изображения, однако у меня была некоторая путаница, когда дело доходило до сохранения изображения в каталоге документов с помощью SDWebImage, поэтому я решил не использовать его. Я использовал dispatch_sync(dispatch_get_main_queue()
и мой метод теперь выглядит следующим образом:Сохранение изображения с URL-адреса асинхронно
- (void)saveImageFromURL:(UIImage*)image:(NSURL*)imageURL {
NSString *url = [imageURL absoluteString];
NSArray *parts = [url componentsSeparatedByString:@"/"];
NSString *filename = [parts lastObject];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", filename]];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:fullPath];
if (fileExists) {
NSLog(@"File already exists");
_myUIImage.image = [UIImage imageNamed:fullPath];
return;
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
[self.myUIImage sd_setImageWithURL:imageURL placeholderImage:image];
UIImage *imageFromURL = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageURL]];
NSData *imageDataNew = UIImagePNGRepresentation(imageFromURL);
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:fullPath contents:imageDataNew attributes:nil];
});
}
}
У меня есть несколько вопросов, это реализация достаточно хорошо, так как я работаю на приложение, которое будет на магазин приложений? Будет ли загрузка изображения из URL-адреса выполняться асинхронно? (я знаю, что использую dispatch_async
, но просто нужно подтвердить). Если да, то это не будет блокировать мой пользовательский интерфейс, верно?
трудно. так как вы делаете это в dispatch_get_main_queue – heximal
Вы имели в виду: '' 'dispatch_sync (dispatch_get_main_queue()' '' без конечной скобки, или это опечатка? –
dispatch_sync - как вы можете ожидать от нее имя - это будет Если вы вызываете saveImageFromURL из основного потока - он будет заблокирован. MoreOver dispatch_get_main_queue() - на самом деле главный поток. Так что ваша реализация будет блокировать пользовательский интерфейс в любом случае. – DoN1cK