首先,這不是一個重複的問題。我已經閱讀了堆棧溢出的許多問題,但他們沒有幫助完全解決我的問題。下載圖片異步到NSData和緩存
我正在從Web服務下載圖像。由於沒有人喜歡UI停滯,我正在使用線程分別下載圖像。
NSURL *imageUrl = [NSURL URLWithString:storyImageURL];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
thumbnailData = [NSData dataWithContentsOfURL:imageUrl];
dispatch_async(dispatch_get_main_queue(), ^{
thumbnail = [UIImage imageWithData:thumbnailData];
});
});
如果我究竟使用代碼如上所述,用戶界面將不會停止,直到它從Web服務獲取數據,但圖像沒有緩存。
如果我不使用線程,那麼UI將會停頓,但圖像使用NSCoding方法(存檔)進行緩存。
我的問題是:我能做些什麼來同時使用線程和緩存縮略圖?請不要建議任何第三方庫。
UPDATE:通過代碼一次去再之後,有可能是我能想到的兩個問題:
1)看起來像的NSKeyedArchiver和NSKeyedUnarchiver完成線程之前下載的圖像被稱爲但那只是一個猜測。在一個單獨的存儲文件我使用的NSKeyedArchiver和NSKeyedUnarchiver:
- (RSSChannel *)fetchRSSFeedWithCompletion:(void (^)(RSSChannel *, NSError *))block
{
NSURL *url = [NSURL URLWithString:@"http://techcrunch.com/feed"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
RSSChannel *channel = [[RSSChannel alloc] init];
TheConnection *connection = [[TheConnection alloc] initWithRequest:req];
//[connection setCompletionBlock:block];
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
cachePath = [cachePath stringByAppendingPathComponent:@"HAHAHA.archive"];
RSSChannel *cachedChannel = [NSKeyedUnarchiver unarchiveObjectWithFile:cachePath];
if (!cachedChannel)
cachedChannel = [[RSSChannel alloc] init];
RSSChannel *channelCopy = [cachedChannel copy];
[connection setCompletionBlock:^(RSSChannel *obj, NSError *err) {
if (!err) {
[channelCopy addItemsFromChannel:obj];
[NSKeyedArchiver archiveRootObject:channelCopy toFile:cachePath];
}
block(channelCopy, err);
}];
[connection setXmlRootObject:channel];
[connection start];
return cachedChannel;
}
2),我能想到的第二個問題是,他UI它試圖縮略圖緩存實現解碼後不清爽。
我試過你在代碼中提供的代碼。在RSSItem.m下的CDATA塊中,您添加了此代碼// - ADD dispatch_group_async([self.parentParserDelegate imageDownloadGroup],dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ {.......我正在接收運行時錯誤「ARC語義問題 - 沒有已知的實例方法選擇'ImageDownloadGroup'」 – AJ112 2013-03-07 00:51:05
奇怪,它正在爲我編譯。嘗試:dispatch_group_async(((RSSChannel *)self.parentParserDelegate).imageDownloadGroup,...' - 只是一個鑄造問題... – sergio 2013-03-07 18:31:12
它的工作。非常感謝真棒幫助,因爲只有你能夠理解問題背後的真實問題。我需要問的最後一件事。它的實施方式,你認爲我需要轉移到核心數據?因爲涉及很多圖像。我打算修剪條目,一旦他們達到100. – AJ112 2013-03-08 02:37:29