2016-04-25 6 views
0

Итак, я уже прошел почти все вопросы по 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, но просто нужно подтвердить). Если да, то это не будет блокировать мой пользовательский интерфейс, верно?

+0

трудно. так как вы делаете это в dispatch_get_main_queue – heximal

+0

Вы имели в виду: '' 'dispatch_sync (dispatch_get_main_queue()' '' без конечной скобки, или это опечатка? –

+0

dispatch_sync - как вы можете ожидать от нее имя - это будет Если вы вызываете saveImageFromURL из основного потока - он будет заблокирован. MoreOver dispatch_get_main_queue() - на самом деле главный поток. Так что ваша реализация будет блокировать пользовательский интерфейс в любом случае. – DoN1cK

ответ

0
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 

// *** Load Image from URL Asynchronously without blocking Main thread ***  
UIImage *imageFromURL = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageURL]]; 

    dispatch_async(dispatch_get_main_queue(), ^(void){ 

     // *** Create file path to DocumentDirectory *** 
     NSString * docDirPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
     NSString *filePath = [docDirPath stringByAppendingPathComponent:@"myImage.jpg"] 

     // *** Write Image to disk *** 
     BOOL isSaved = [UIImageJPEGRepresentation(image, 1.0f) writeToFile:dirPath atomically:YES]; 
     if(isSaved) 
     { 
      NSLog(@"Image write to disc successfully."); 
     } 
    }); 
}); 
+0

Вместо этого я могу не просто сохранить изображение асинхронно, как я сделал, в чем разница между ними. Извините, я новичок в разработке iOS. – TKutal

+0

Вы можете это сделать, но когда у вас есть ситуация, когда вы загружаете изображение, сохраняете и отображаете в 'UIImageView', тогда вам нужно будет его обновить в' dispatch_async (dispatch_get_main_queue(),^(void) ', иначе это будет не отображайте на экране. Все операции пользовательского интерфейса должны выполняться только на главной теме. –

+0

Извините, но я не понимаю, что вы пытаетесь передать, вы хотите сказать, если изображение не в моем каталоге, тогда мой код не будет работа? – TKutal