Статическая переменная для связи между объектами одного типа - PullRequest
0 голосов
/ 24 мая 2010

У меня есть метод, который загружает изображения асинхронно.Если изображения связаны с массивом объектов (общий вариант использования в приложении, которое я создаю), я хочу их кэшировать.Идея в том, что я передаю индексный номер (на основе indexPath.row таблицы, которую я делаю путем), и я прячу изображение в статическом NSMutableArray, указанном на строке таблицы, с которой я работаюс.

Таким образом:

@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] никогда не оставляет ноль.

Это мой первый набег на статические переменные, поэтому я предполагаю, что я делаю что-то не так.

(Приведенный выше код сильно обрезан, чтобы показывать только главное, что происходит, поэтому помните об этом, когда смотрите на него.)

1 Ответ

1 голос
/ 24 мая 2010

Вы, кажется, никогда не инициализируете imageCache и, возможно, вам повезло, что его значение 0.Инициализацию лучше всего выполнить в инициализации класса, например:

@implementation ImageDownloader
// ...
+(void)initialize {
    imageCache = [[NSMutableArray alloc] init];
}
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...