iPhone:无法设置从NSMutableDictionary中的线程接收的对象

时间:2010-08-28 16:32:17

标签: iphone multithreading thread-safety nsmutabledictionary

我有一个线程(特别是一个NSOperation),当我的主视图要求时,它会为我加载一些图像以获得滚动视图。任何数量的这些NSOperations都可以一次排队。所以它与我给它的文件路径一起并从磁盘加载图像(作为UIImages)然后通过使用performSelectorOnMainThread将对象发送回我的主视图:并将我的主视图传递给对象的NSDictionary,以及图像ID值。然后我的主视图应该将图像对象和图像ID字符串插入到主视图能够使用的NSMutableDictionary中。我已经验证了NSMutableDictionary的分配和初始化很好,但是当NSOperation调用的方法尝试将对象添加到字典时没有任何反应。我已经验证了我从线程发送给我的字典中得到的对象和字符串不是null或者任何东西但是它不起作用。我没有做正确的事情或使用不好的技术?在这样的情况下,我需要建议做什么,我需要从线程中将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 个答案:

答案 0 :(得分:1)

[mainViewController performSelectorOnMainThread:@selector(imageLoaderLoadedImage:) withObject:nil waitUntilDone:NO];

您没有将returnDict作为参数传递给方法。你正在通过nil

其他一些想法:

  • 您无需创建returnDict。您只需使用dict作为方法参数。
  • 你正在泄漏returnImage

修改

由于您显然 returnDict作为参数传递给方法,我的另一个猜测是mainViewControllernil。除此之外,您的代码看起来很实用。