NSMutableArray使用内存优化进行排序和分组

时间:2012-12-15 20:26:00

标签: objective-c ios memory nsmutablearray nsarray

NSArray中有ItemObject。此ItemObject未根据ItemID

进行分组

json的示例如下所示: 你会注意到itemIDs“a123”,“a124”。可以有n个itemID。

[
    {
        "ItemName": "John",
        "ItemID": "a123"
    },
    {
        "ItemName": "Mary",
        "ItemID": "a124"
    },
    {
        "ItemName": "Larry",
        "ItemID": "a123"
    },
    {
        "ItemName": "Michel",
        "ItemID": "a123"
    },
    {
        "ItemName": "Jay",
        "ItemID": "a124"
    }
]

上述响应存储在NSArray中,如下所示:

NSMutableArray *itemArray=[[NSMutableArray alloc] init];

ItemObject *obj=[[ItemObject alloc] init];
obj.itemName=@"John";
obj.itemID=@"a123";
[itemArray addObject:obj]

.....

ItemObject *objN=[[ItemObject alloc] init];
objN.itemName=@"Jay";
objN.itemID=@"a124";
[itemArray addObject:objN].

这表明,如果JSON中有N个项目,那么它将创建一个包含N个项目的数组。

以上项目在UItableView中正确显示。

现在,如果想要对它们进行排序并将它们放在NSMutableArray组中,那将是最佳的代码编码方式,消耗更少的内存。 [即排序+分组] 我正在努力实现以下目标:

NSMutableArray *itemArray=[[NSMutableArray alloc] init];
at index 0: NSArray with itemID "a123"
at index 1: NSArray with itemID "a124"

因为可用的ItemIds是动态的,正如我所解释的那样,itemId的数量可以是“N”。

第1步: 所以,我首先需要找到可用的itemId。

第2步:

NSMutableArray *myArray=[[NSMutableArray alloc] init];
for(NSString *itemID in itemIDS){
 NSArray *itemsForID=[itemArray filterUsingPredicate:[NSPredicate predicateWithFormat:"itemID MATCHES %@",itemID]];
[myArray addObject:itemsForID];
}

myArray是预期的结果。 但是使用filterUsingPredicate“N”次会耗费时间和内存。

任何,帮助感谢。

2 个答案:

答案 0 :(得分:1)

请试试下面的代码吗?

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"itemID"  ascending:YES];
[itemArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];

答案 1 :(得分:0)

您可以将数据保存为NSManagedObjects。然后,您可以使用NSFetchedResultsController作为表的数据源(您设置排序描述符和部分名称键路径):

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
        initWithFetchRequest:fetchRequest
        managedObjectContext:context
        sectionNameKeyPath:nil
        cacheName:nil];

您还可以设置批量大小(一次从DB获取的最大对象数)。

希望这有帮助!