1

NSArray には ItemObject が含まれています。この ItemObject は ItemID に基づいてグループ化されていません

json のサンプルを以下に示します。 itemID の「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"

利用可能な ItemId は動的であるため、説明したように、「N」個の itemId が存在する可能性があります。

ステップ 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" 回を使用すると、時間とメモリが消費されます。

何でも、助けてください。

4

2 に答える 2

1

以下のコードを試していただけますか?

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"itemID"  ascending:YES];
[itemArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
于 2012-12-15T20:39:38.650 に答える
0

データを NSManagedObjects として永続化できます。次に、NSFetchedResultsControllerをテーブルのデータ ソースとして使用できます (ソート記述子とセクション名のキー パスを設定します)。

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

バッチ サイズ (一度に DB から取得されるオブジェクトの最大数) を設定することもできます。

お役に立てれば!

于 2012-12-15T21:13:48.293 に答える