如何在NSDictionary中剖析和重新组织信息

时间:2011-05-05 21:20:55

标签: iphone objective-c nsdictionary

所以我有一组NSDictionaries,每个NSDictionary都有一堆与照片方面相关的键/值对(来自Flickr)。

我正在创建一个具有UITableViewController的应用,其单元格应该是每个不同类别的照片。所以在伪代码中,我正在尝试构建一个新的NSDictionary(键是照片的类别,值是包含该键的照片的NSDictionaries)。我正在遍历初始数组中的每个NSDictionary,获取类别标记,并说,如果我的新NSDict不包含此键,则为空数组创建一个新键。然后将当前NSDict添加到该数组。我得到了一致的错误,不知道为什么。

这是稀释代码。

  photoList = [FlickrFetcher photosWithTags:[NSArray arrayWithObjects: @"CS193p_SPoT", nil]];
    NSLog(@"%@", photoList);
    categories = [[NSDictionary alloc] init]; 
    NSArray *temp = [[NSArray alloc] init];
    for (id obj in photoList) {
        temp = [[obj objectForKey:@"tags"] componentsSeparatedByString:@" "];
        for (id string in temp) {
            if (![categories objectForKey:string]) {
                NSMutableArray *arr = [[NSMutableArray alloc] init];
               [categories setObject:arr forKey:string];
                //[arr release];
            }
            NSMutableArray *photos = [categories objectForKey:string];
            [photos addObject:obj];
            [categories setObject:photos forKey:string];
        }
    }

谢谢!

2 个答案:

答案 0 :(得分:4)

NSDictionary没有方法setObject:forKey:。您需要NSMutableDictionary

self.categories = [NSMutableDictionary dictionary];

除此之外,请使用Joost优秀的代码重写。

SIGABRT,你知道,很可能意味着某个断言失败了。在这种情况下,它可能是CoreFoundation *中的一个断言;当您尝试访问类似的字典时,CF会检查是否存在可变性,如果对象不可变则会导致中断。


*我最近刚刚了解了CF source's availability并且一直在研究它,所以这可能只是“新事物”偏见和错误。

答案 1 :(得分:1)

我没有注意到代码中的任何错误(语法错误),但是这里有一段更新的代码,它实现得更清晰(没有内存泄漏)

self.photoList = [FlickrFetcher photosWithTags:[NSArray arrayWithObjects: @"CS193p_SPoT", nil]];
NSLog(@"%@", photoList);
self.categories = [NSDictionary dictionary];
for (NSDictionary *obj in photoList) {
    NSArray *temp = [[obj objectForKey:@"tags"] componentsSeparatedByString:@" "];
    for (NSString *string in temp) {
        NSMutableArray *photos = [categories objectForKey:string];
        if (!photos) {
           photos = [NSMutableArray array];
           [categories setObject:photos forKey:string];
        }
        [photos addObject:obj];
    }
}

如果它不起作用,请告诉我们确切的警告,是否是由此造成的。