우선이 질문은 중복되지 않습니다. 스택 오버플로에 대한 많은 질문을 읽었지만 문제를 완전히 해결하는 데 도움이되지 않았습니다.NSData 및 캐시에 비동기 적으로 이미지 다운로드
웹 서비스에서 이미지를 다운로드 중입니다. 어느 누구도 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];
});
});
의 UI가 중단되지 않습니다.
스레드를 사용하지 않으면 UI가 정지하지만 이미지는 NSCoding 메서드 (보관)를 사용하여 캐시됩니다.
제 질문은 : 스레드를 사용하고 미리보기 이미지를 동시에 캐시하려면 어떻게해야합니까? 제 3 자 라이브러리를 제안하지 마십시오.
UPDATE :
1) 스레드가 이미지를 다운로드가 완료되기 전에 호출되고있는 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이다 : 별도의 저장소 파일에서 내가 NSKeyedArchiver와 NSKeyedUnarchiver을 사용하고 있습니다.
나는 요점에 제공 한 코드를 시도했다. 이 코드를 추가 한 RSSItem.m 아래의 CDATA 블록에서 // - ADD dispatch_group_async ([self.parentParserDelegate imageDownloadGroup], dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{....... 실행 시간 오류 "ARC 시맨틱 문제 - 선택자 'ImageDownloadGroup'에 대한 알려진 인스턴스 메소드가 없습니다. – AJ112
이상한데 컴파일 중입니다.'- 캐스팅 문제 만 ... – sergio
. 질문 뒤에 숨겨진 실제 문제를 이해할 수 있었기 때문에 멋진 도움을 주셔서 감사합니다. 내가 물어야 할 마지막 한가지. 구현 방법, 핵심 데이터로 이동해야합니까? 많은 이미지가 관련되어 있기 때문입니다. 나는 그들이 100에 도달하면 항목을 가지 치기 위해 계획하고있다. – AJ112