2013-09-25 149 views
2

我有一個應用程序,它從數據庫中提取圖像的URL並將其存儲在coredata中。然後在我的應用程序視圖中,有一個imageviews滾動視圖,基本上我試圖做一個圖像滑塊。這些圖像趨於更新,因此需要從服務器加載。我從coredata加載圖像URL,將它們下載到uiimages並加載到我的視圖中。問題是,我在運行時做得很慢。將圖像從網絡服務器保存到手機圖像滑塊

我想知道什麼是最好的方式去做這件事。我想在應用程序啓動時首先將所有圖像加載到手機中?我試圖尋找一些示例代碼來指向正確的方向,但我只能找到將圖像保存到手機相機膠捲而不是應用程序本身的代碼。任何人都可以幫忙嗎?謝謝!

回答

1

如下是一個UIImage,目標路徑和圖片的文件名(要保存圖像的目錄)的方法,並且將圖像保存爲PNG文件:

-(BOOL) saveImage:(UIImage *)image savePath:(NSString *)savePath filename:(NSString *)filename{ 
    savePath = [savePath stringByAppendingPathComponent:filename]; 
    NSData *sourceData = UIImagePNGRepresentation(image); 
    return [sourceData writeToFile:savePath atomically:YES]; 
} 

你將需要將圖像存儲在應用程序沙箱中的正確位置。例如,請勿將它們放在「文檔」文件夾中,因爲它可能會被Apple拒絕,因爲您可以重新創建(或重新下載)這些圖像。您可能希望將它們放在Library/Caches文件夾中,並準備在刪除它們時重新下載它們。有關詳細信息,請參閱iOS File System Programming Guide

我會擔心在應用程序啓動時下載所有文件,因爲如果應用程序在下載大量圖像文件時沒有響應,它看起來應該已經凍結。您可以在後臺下載圖像,並在圖像完成下載時更新UI。

這樣做的一種方法是檢查圖像是否已被下載(例如,它是否位於Library/Caches文件夾中)。如果是,則使用它,否則使用佔位符圖像,直到下載圖像。例如:

if (isImageAvailable) { 
    displayedImageView.image = cachedImage; 
} else { 
    displayedImageView.image = placeholderImage; 
    [self getImageAtURL:imageURL andThenDo:^(UIImage *image) { 

     // Replace placeholder image with downloaded image 
     displayedImageView.image = image; 

    }]; 
} 

替換isImageAvailable與檢查在庫/緩存文件夾中的圖像文件是否存在的方法。 displayedImageView是您正在顯示圖像的UIImageView

getImageAtURL方法看起來是這樣的:

-(void)getImageAtURL:(NSURL *)url andThenDo:(void(^)(UIImage *image))completionBlock{ 

    // Run on background thread 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     UIImage *image; 

     // Insert code to download image... 

     // Switch to main (UI) thread to allow updating the UI 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      completionBlock(image); 
     }); 
    }); 

} 
+0

感謝您的真棒建議!儘管我對塊不太熟悉,但會試試看。使用塊必不可少? – Moo33

0

您可能不需要將圖像下載到您的應用程序,我可以建議你更好使用圖像的URL它的自我加載從服務器時,它自身的圖像。

要加載從服務器映像U可以使用下列內容:

UIImage* yourImageview = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:your.image_url]]]; 

下載所有的圖像也將您的應用程序變慢。

相關問題