0

我正在尝试将从外部服务获取的图像添加到 NSMutableDictionary 并看到奇怪的结果。这就是我正在做的事情:

- (void)fetchImages{
//Fetch Item Brand Images
//self.itemBrands is an NSArray of NSDictionaries
for (NSDictionary *itemBrand in self.itemBrands){

    NSString *currentItemId = [itemBrand objectForKey:@"ITEM_ID"];

    //Valid Item Id. This Log message is displayed
    NSLog(@"Current Item Id: %@",currentItemId);

    NSString *currentItemImageUrl = [[IMAGE_URL stringByAppendingString:currentItemId] stringByAppendingString:@".png"];

    //Image URL is valid. This log message is displayed
    NSLog(@"Current Image URL: %@",currentItemImageUrl);

    NSURL *url = [NSURL URLWithString:currentItemImageUrl];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];
    if (image == nil){
        //This log message is displayed when image is not present
        NSLog(@"Image not Present 1");
    }else{
        //This log message is displayed when image is present
        NSLog(@"Image Present 1");
        [self.itemBrandImages setObject:image forKey:currentItemId];
    }

}

//This for loop is not being executed at all. No log messages displayed.   
for(id key in self.itemBrandImages){

    NSLog(@"Current Item Id2: %@",key);
    if ([self.itemBrandImages objectForKey:key] == nil){
        NSLog(@"Image Not Present 2");
    }else{
        NSLog(@"Image Present 2");
    }
}
}

我在 self.itemBrandImages 上迭代的第二个 for 循环根本没有被执行。没有显示里面的任何日志消息。

在此处发布我的问题之前,我尝试了以下操作:

1)研究堆栈溢出中的类似问题,并结合其中之一的建议。建议是在 .m 文件的 init 方法中“执行 NSMUtableDictionary 的分配初始化”。这也没有帮助。

2)为了隔离问题,我什至尝试将一个简单的字符串添加到 NSMUtableDictionary 而不是图像,但即使这样似乎也没有保留。

我真的很困惑我在这里错过了什么或做错了什么。输入非常感谢。

谢谢,迈克·G

4

2 回答 2

1

Perhaps:

for(NSString *key in [self.itemBrandImages allKeys])
于 2013-07-21T19:08:40.513 回答
0

我在我的 fetchImages 方法中对 NSMutableDictianary 做了一个 alloc init,它成功了!不知道为什么 init 方法中的 alloc init 不起作用。

所以这是我对这个问题的总结:

1)如果您有一个数组或字典@property,您只是获取和设置而不是真正添加或删除对象,那么您不需要显式分配初始化它们。

2) 如果你有一个数组或字典 @property 来添加或删除对象,你需要显式地分配初始化它们。

我的上述陈述是真的吗?很想听听您对此的意见。

谢谢,迈克

新代码:

- (void)fetchImages{
    //Fetch Item Brand Images
    self.itemBrandImages = [[NSMutableDictionary alloc] init];
    for (NSDictionary *itemBrand in self.itemBrands){

    NSString *currentItemId = [itemBrand objectForKey:@"ITEM_ID"];
    NSLog(@"Current Item Id in ItemList: %@",currentItemId);
    NSString *currentItemImageUrl = [[@"http://anythingtogo.freeiz.com/images/"stringByAppendingString:currentItemId] stringByAppendingString:@".png"];
    NSLog(@"Current Image URL in ItemList: %@",currentItemImageUrl);

    NSURL *url = [NSURL URLWithString:currentItemImageUrl];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];

    if (image == nil){
        NSLog(@"Image not Present 1");
    }else{
        NSLog(@"Image Present 1");
        [self.itemBrandImages setObject:@"Test" forKey:currentItemId];
    }

    }
于 2013-07-21T21:36:10.707 回答