iOS 繞過 `Too many open files` 本地圖片加載失敗問題

測試發(fā)現(xiàn)了一個古怪的問題,App 在一些低端機上,自然息屏,再打開的時候 一些本地圖片會不見了?(每次 didBecomeActive 的時候 會原地刷新一下)

image.png

經(jīng)過各種嘗試,有個小伙伴最終復現(xiàn)了對應場景。

立馬進行 Debug,發(fā)現(xiàn)在讀取 本地圖片資源的時候 就報錯了。。。

image.png
image.png

這是個頭疼的問題,Too many open files google 一下也搞不定。 自己也很難定位具體的原因(哪里文件打開過了,根本不知道。。。),該問題在 AppStore(release) 包上不會復現(xiàn),(可能跟 Debug模式下,有代碼偷偷做了什么。。。)

Too many open files 我們解決不了,那有別的方式繞過這個問題嗎?

記錄頁面原地刷新?如何不空大?

下面是核心代碼:


@interface IMYImageMemoryCache ()
@property (nonatomic, strong) YYMemoryCache *memoryCache;
@property (nonatomic, strong) NSMapTable *weakCache;
@property (nonatomic, strong) dispatch_semaphore_t dsem;
@end

@implementation IMYImageMemoryCache

- (id)objectForKey:(id)key {
    if (!key) {
        return nil;
    }
    id obj = [_memoryCache objectForKey:key];
    if (!obj) {
        dispatch_semaphore_wait(_dsem, DISPATCH_TIME_FOREVER);
        obj = [_weakCache objectForKey:key];
        dispatch_semaphore_signal(_dsem);
        if (obj) {
            NSUInteger cost = IMYCacheCostForImage(obj);
            [_memoryCache setObject:obj forKey:key withCost:cost];
        }
    }
    return obj;
}

- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g {
    if (!key) {
        return;
    }
    [_memoryCache setObject:obj forKey:key withCost:g];
    dispatch_semaphore_wait(_dsem, DISPATCH_TIME_FOREVER);
    [_weakCache setObject:obj forKey:key];
    dispatch_semaphore_signal(_dsem);
} 

@end

問題1:為啥 MemoryCache 找不到 Image了,而 WeakMap 里面還有?

問題2:該方案還有其他運用場景嗎?

這次的方案來自 SDWebImage 5.x 版本的 SDMemoryCache

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容