2014-08-28 98 views
0

我有一個需要寫入/讀取圖像的文件緩存。清理隊列中所有其他請求的GCD隊列

所有與我需要在後臺執行的文件系統的工作。

爲了這個目的,用於保存文件我用:

dispatch_barrier_async([AxPanoramaDataManager sharedInstance].dataManagerQueue, ^{ 
    [data writeToFile:tileFilePathName atomically:YES]; 
}); 

而對於閱讀:

__block UIImage *tileImage = nil; 
    dispatch_sync([AxPanoramaDataManager sharedInstance].dataManagerQueue, ^{ 
     tileImage = [[UIImage imageWithContentsOfFile:tileFilePathName] retain]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      completion (tileCoordValue, side, tileImage, error); 
      [tileImage release]; 
     }); 
    }); 

一切運作良好,有現金文件夾中的文件量很大,但我有時我需要清理現金。我需要取消所有的隊列塊並執行一個清除文件夾的塊。

我的第一實現方法是這樣的:

+ (void) cleanCash 
{ 
    NSString *folderPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingString:@"cash"]; 
    dispatch_sync([AxPanoramaDataManager sharedInstance].dataManagerQueue, ^{ 
     NSError *error = nil; 
      [[NSFileManager defaultManager] removeItemAtPath:folderPath error:&error]; 
      NSParameterAssert(error == nil); 
     } 
    }); 
} 

但我與它的許多問題,因爲它沒有在隊列取消所有等待的操作。我嘗試在SO中尋找解決方案,但不幸的是無法實現它們。誰能幫我這個?

+0

難道你不是指「緩存」而不是「現金」? – Koen 2014-08-28 15:05:07

+0

是的,抱歉,En不是我的母語 – ShurupuS 2014-08-29 04:33:45

+0

不用擔心,也不是我的:)我以爲這是一個有趣的錯字! – Koen 2014-08-29 10:34:31

回答

0

你可以使用NSOperationQueue和maxConcurrentOperationCount = 1(它將創建一個串行隊列)來運行NSOperation,它將加載你的圖像; NSOperation是一個可取消的對象。您也可以在操作之間進行依賴關係。

P.S. 您可以查看SDWebImage,它包含SDImageCache類。它對於管理圖像緩存非常有用。

+2

這值得詳細闡述;一旦提交給GCD隊列,這些塊本身不會被取消。如果你想要取消行爲,你必須通過讓他們檢查一些外部狀態來確定他們應該立即返回還是繼續他們的工作,從而將其建立到你的區塊。 「NSOperation」和「NSOperationQueue」是內置此取消行爲的更高級別的抽象。 – ipmcc 2014-08-28 14:36:31