iphone圖庫打開為什麼縮略圖不需要緩衝載入時間?

iphone圖庫打開後圖片縮略圖的顯示為什麼不需要緩衝載入。而安卓和windows phone 的圖庫在打開時圖片的縮略圖顯示需要緩衝時間。蘋果是怎麼做到的?這是什麼原理?


如何寫一個custom image picker?

1.獲取所有照片group信息.

[_library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos | ALAssetsGroupAlbum

usingBlock:block

failureBlock:failureBlock];

都是非同步的.一般在viewwillappear里做,然後用戶點開了之後已經看到了所有照片分組.這個肯定是秒載入,沒什麼問題.

2.用戶點開了某個分組之後,進入到這個分組的所有照片.

[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

if (result ==nil) {

completionblock(images);

*stop = YES;

return;

}

PhotoItemModel *pItem = [[PhotoItemModel alloc]initWithALAssert:result];

[images addObject:pItem];

}];

這個也是非同步,每個圖片信息是一個叫AlAsset的類,(result就是一個alasset類,只是我們把它放在了我們自己定義的model里)裡面存了一個thumb(CGImage)和一個大圖的url.

秒載入的原因是因為都是小圖,每個thumb也就是幾十K的樣子,又是非同步.

3.點擊小圖進入大圖,通過alasset提過的大圖url,返回一個cgimage

ALAssetRepresentation *assetRep = [_currentPhotoItem.assert defaultRepresentation];

CGImageRef imgRef = [assetRep fullScreenImage];

那麼你的答案已經來了,實際上系統相冊讀取的任然是壓縮過的圖片,而不是原尺寸圖片.系統會讀取一張在原比例不變的情況下最適應屏幕大小的圖(就是fullScreenImage類型),所以,這張圖依然很小.可能只有在進入編輯以後系統才會讀一張fullResolutionImage(全尺寸圖).

答案已經呼之欲出,按照iphone的性能,讀一張640*960或者640*1136再或者6或者6p大小的圖完全是秒讀.


你試試把photo library 放在移動硬碟里你就看出區別了。


不知道Android和其他平台為什麼慢,但是推斷一下 iOS 快的原因:iOS在存儲照片的時候就把縮略圖載入到緩存里了,然後會把這個緩存以文件的方式寫入內存。因為縮略圖都是正方形而且dimension非常小,所以圖與圖之間的大小是一樣的,所以在內存里能夠align成一個數組快速查找。具體的原理類似這樣一個開源庫,它能讓任何自定義的圖片庫瀏覽功能快的像飛一樣,尤其是高速上下滾動的時候沒有一點延遲。

path/FastImageCache · GitHub


打開那一瞬間也還是會白0.幾秒嘛,也就是快的不大明顯而已,沒有4s或者4,如果有估計那啟動圖庫時候的白屏更久


應該是手機內存儲和外部存儲的區別,Android大部分都是SD卡裡面,我有一個同學做手機擴容殼的,讀取擴容殼裡面的圖片就比較慢


推薦閱讀:

為什麼第三種寫法不對呢?
VS會不會成為移動開發首選?C#會不會崛起?
舊的 iOS 應用該如何適配 iOS 7?
App 的頻繁升級,會讓你覺得厭煩嗎?

TAG:iPhone | iOS開發 | iPhone6 |