2010-05-24 2 views
0

비동기 적으로 이미지를 다운로드하는 메서드가 있습니다. 이미지가 객체 배열 (건물중인 앱의 일반적인 유스 케이스)과 관련되어 있다면이를 캐시하고 싶습니다. 아이디어는 인덱스 번호를 전달하는 것입니다 (내가 작성하는 테이블의 indexPath.row를 기반으로 함). 정적 NSMutableArray에 이미지를 숨기고, 처리중인 테이블의 행에 키가 있습니다. 와.같은 형식의 개체 간 통신을위한 정적 변수

thusly 히는 :

내 인덱스가 괜찮 통해 점점
@implementation ImageDownloader 

... 
@synthesize cacheIndex; 

static NSMutableArray *imageCache; 

-(void)startDownloadWithImageView:(UIImageView *)imageView andImageURL:(NSURL *)url withCacheIndex:(NSInteger)index 
{ 
    self.theImageView = imageView; 
    self.cacheIndex = index; 
    NSLog(@"Called to download %@ for imageview %@", url, self.theImageView); 


    if ([imageCache objectAtIndex:index]) { 
     NSLog(@"We have this image cached--using that instead"); 
     self.theImageView.image = [imageCache objectAtIndex:index]; 
     return; 
    } 

    self.activeDownload = [NSMutableData data]; 

    NSURLConnection *conn = [[NSURLConnection alloc] 
      initWithRequest:[NSURLRequest requestWithURL:url] delegate:self]; 
    self.imageConnection = conn; 
    [conn release]; 
} 

//build up the incoming data in self.activeDownload with calls to didReceiveData... 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"Finished downloading."); 

    UIImage *image = [[UIImage alloc] initWithData:self.activeDownload]; 
    self.theImageView.image = image; 

    NSLog(@"Caching %@ for %d", self.theImageView.image, self.cacheIndex); 
    [imageCache insertObject:image atIndex:self.cacheIndex]; 
    NSLog(@"Cache now has %d items", [imageCache count]); 

    [image release]; 

} 

, 내 NSLog 출력에 의해 있음을 볼 수 있습니다. 하지만 내 insertObject : atIndex : call 후에도 [imageCache count]은 0이되지 않습니다.

이것은 정적 변수에 대한 나의 첫 번째 침략입니다. 그래서 나는 잘못된 것을하고 있다고 생각합니다.

(위의 코드는 크게 무슨 일이 일어나고 있는지 만 중요한 것은 보여, 그래서 당신이 그것을 보면 염두에 부담 제거됩니다.) 당신은 imageCache를 초기화하지 않을 것 같다 아마로 운이있어

답변

1

값은 0입니다. 초기화는 클래스 초기화에서 가장 잘 수행됩니다 (예 :

@implementation ImageDownloader 
// ... 
+(void)initialize { 
    imageCache = [[NSMutableArray alloc] init]; 
} 
// ... 
+0

허). 나는 초기화에 대해 궁금해한다. '- (ImageDownloader *) init'에서 그것을하는 것은 분명히 잘못되었습니다. CLASS 이니셜 라이저가 생겼다. 이것은 if ([imageCache objectAtIndex : index]) {'로 처음으로 갈 때 범위를 벗어난 오류를 얻는다는 것을 제외하고는 이제 작동 할 것입니다. 여기에있는 동안 Obj-C에서 배열 인덱스를 조건부로 테스트하는 방법은 무엇입니까? –

+1

'if (index <[imageCache count])' –