iPhone: невозможно установить объект, полученный из потока в NSMutableDictionary - PullRequest
0 голосов
/ 28 августа 2010

У меня есть поток (в частности, NSOperation), который запускается для загрузки некоторых изображений для меня для просмотра с прокруткой, когда мой основной вид запрашивает их.Любое количество этих операций NSO может быть поставлено в очередь одновременно.Таким образом, он идет с заданным мной путем к файлу, загружает изображение с диска (как UIImages), а затем отправляет объект обратно в мой mainview с помощью executeSelectorOnMainThread: и передает моему mainview NSDictionary объекта и значение ID изображения.Мой основной вид затем должен вставить объект изображения и строку идентификатора изображения в NSMutableDictionary, который он имеет для основного вида, чтобы иметь возможность использовать.Я проверил, что NSMutableDictionary правильно выделен и инициализирован, но когда метод, вызываемый NSOperation, пытается добавить объекты в словарь, ничего не происходит.Я проверил, что объект и строка, которые я получаю из словаря, который отправил мне поток, не равны нулю или что-то еще, но все же это не работает.Я не делаю что-то правильно или использую плохую технику?Что бы кто-нибудь посоветовал сделать в такой ситуации, когда мне нужно добавить UIImages в NSMutableDictionary из потока?Большое спасибо!

Вот код NSOperation, который я использую:

- (void)main {
    NSString *filePath = [applicaitonAPI getFilePathForCachedImageWithID:imageID andSize:imageSize];
    UIImage *returnImage = [[UIImage alloc] initWithContentsOfFile:filePath];

    if (returnImage) {
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2];
        [dict setObject:returnImage forKey:@"IMAGE"];
        [dict setValue:[NSString stringWithFormat:@"%d", imageID] forKey:@"IMAGE_ID"];
        NSDictionary *returnDict = [[NSDictionary alloc] initWithDictionary:dict];
        [dict release];
        [mainViewController performSelectorOnMainThread:@selector(imageLoaderLoadedImage:) withObject:returnDict waitUntilDone:NO];
        [returnDict release];
    }
}

А вот метод в главном потоке:

- (void)imageLoaderLoadedImage:(NSDictionary *)dict {
  UIImage *loadedImage = [dict objectForKey:@"IMAGE"];
  NSString *loadedImage = [dict valueForKey:@"IMAGE_ID"];
  [imagesInMemoryDictionary setObject:loadedImage forKey:loadedImageID];
  [self drawItemsToScrollView];
}

1 Ответ

1 голос
/ 28 августа 2010
[mainViewController performSelectorOnMainThread:@selector(imageLoaderLoadedImage:) withObject:nil waitUntilDone:NO];

Вы не передаете returnDict в качестве параметра методу.Вы передаете nil.

Пара других мыслей:

  • вам не нужно создавать returnDict.Вы можете просто использовать dict в качестве параметра метода.
  • у вас есть утечка returnImage.

edit

Поскольку выочевидно, передают returnDict в качестве параметра метода, мое другое предположение было бы, что mainViewController равно nil.Кроме того, ваш код выглядит функциональным.

...