什麼是一種體面的方式來按需加載UIImages而不阻塞主線程?延遲從文件中加載UIImages而不阻塞主線程?
背景:我可以在牆上滾動幾千張圖片。顯然,加載所有UIImage是不可行的,所以現在我只是懶加載正在顯示的那些UIImage,然後在不再需要時將它們釋放。問題是從文件加載UIImages需要很長時間,只是足夠長的時間才能在滾動時造成口吃。這些絕不是大圖像(大約250x250,也許每個20-30kb),但它們仍然會導致口吃。
什麼是一種體面的方式來按需加載UIImages而不阻塞主線程?延遲從文件中加載UIImages而不阻塞主線程?
背景:我可以在牆上滾動幾千張圖片。顯然,加載所有UIImage是不可行的,所以現在我只是懶加載正在顯示的那些UIImage,然後在不再需要時將它們釋放。問題是從文件加載UIImages需要很長時間,只是足夠長的時間才能在滾動時造成口吃。這些絕不是大圖像(大約250x250,也許每個20-30kb),但它們仍然會導致口吃。
我使用自定義的UIImageView子類來做類似的事情。它主要用於下載圖像(例如,在twitter流中考慮化身和圖像),因此它使用NSURLConnection從URL下載圖像。然後,URLConnection在完成時調用委託方法,然後使用它更新UIImageView。 我稍後添加的額外內容是一個帶有緩存圖像的靜態字典,因此更經常使用的圖像不必每次都下載。這對於像前面提到的twitter頭像那樣的東西非常有用。
我不知道,如果你嘗試加載從網頁或本地的圖像,所以這可能並不完全適用於您的情況,但我希望這有助於...
你可以非常做到這一點簡單的方法。首先在創建一個UIScrollView對象時創建一個隊列。 創建後,您可以使用剛剛創建的隊列從本地存儲裝載圖像。
//get a dispatch queue
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//this will start the image loading in bg
dispatch_async(concurrentQueue, ^{
NSData *image = [[NSData alloc] initWithContentsOfURL:imageURL];
//this will set the image when loading is finished
dispatch_async(dispatch_get_main_queue(), ^{
imageView.image = [UIImage imageWithData:image];
});
});