다음 방법을 사용하여 배열의 아티스트 이미지를 다운로드합니다. 나는 LastFm을 사용하여 이미지를 얻은 다음 ESCache에 저장합니다.이미지를 다운로드 할 때 메모리 문제가 발생합니다. 배열을 통해 루핑
self.imageDownloadingQueue = [[NSOperationQueue alloc] init];
self.imageDownloadingQueue.maxConcurrentOperationCount = 1;
self.artworkCache = [[ESCache alloc] initWithName:@"artworkCache" error:nil];
NSArray *artists = // get artists using relevant framework;
for (MPMediaItemCollection *collection in artists){
[self.imageDownloadingQueue addOperationWithBlock:^{
@autoreleasepool {
MPMediaItem *item = [collection representativeItem];
NSString *artistString = [item valueForProperty:MPMediaItemPropertyAlbumArtist];
BOOL isCachedImage = [self.artworkCache objectExistsForKey:artistString];;
if (!isCachedImage){
[[LastFm sharedInstance] getInfoForArtist:artistString successHandler:^(NSDictionary *result) {
if ([artistString isEqualToString:[[result objectForKey:@"_params"] objectForKey:@"artist"]]) {
NSURL *imageURL = [result objectForKey:@"image"];
if (imageURL){
NSData * data = [NSData dataWithContentsOfURL:imageURL];
UIImage *artistImage = [UIImage imageWithData:data];
[self.artworkCache setObject:artistImage forKey:artistString];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[downloadButton setTitle:artistString forState:UIControlStateNormal];
[downloadButton setBackgroundImage:artistImage forState:UIControlStateNormal];
}];
artistImage = nil;
}
else{
UIImage *newArtworkImage = // get placeholder image;
if (newArtworkImage != nil){
[self.artworkCache setObject:newArtworkImage forKey:artistString];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[downloadButton setTitle:artistString forState:UIControlStateNormal];
[downloadButton setBackgroundImage:newArtworkImage forState:UIControlStateNormal];
}];
newArtworkImage = nil;
}
}
}
else{
}
} failureHandler:^(NSError *error) {
}];
}
}
}];
}
내가 엑스 코드 증가 내 메모리 사용량을 볼 수있는 단지 200메가바이트을 통해, 다음과 같은 오류 내 응용 프로그램 충돌 :
그것은 처음 50 정도 예술가를 순환2015-01-18 20:56:36.479 Mezzo[1481:39314] Received memory warning. Mezzo(1481,0x105254000) malloc: * mach_vm_map(size=147456) failed (error code=3) * error: can't allocate region *** set a breakpoint in malloc_error_break to debug
, 자신의 이미지를 (얻는다 나는 downloadButton
변경을 볼 수있다.) 그러나 그것은 충돌한다. 증가하는 메모리 사용 문제를 어떻게 처리해야할지 모르겠습니다. 이미지를 저장 한 후 이미지를 nil
으로 설정하고 모든 내용을 autoreleasepool
에 넣습니다.
이 배열을 통해 반복되는 메모리 사용량을 어떻게 줄일 수 있습니까? 어떤 도움이라도 대단히 감사 할 것입니다. 감사.
자세한 답변을 보내 주셔서 감사합니다. Rob! didReceiveMemoryWarning에서 캐시를 지우지 만 많은 도움이되지 않았으므로 SDWebImage를 사용하여 이미지를 다운로드했으며 이제는 완벽하게 작동합니다! 확실하지 않은 무엇이 그러나 .... – BadBoolean