0

JSON配列形式で提供されているWebストアのカテゴリデータをREST経由でiOSのコアデータに解析しようとしています。コアデータへの挿入を開始する前に、出力を画面に記録し、結果をカウントしてすべてが正常であることを確認しているだけです。

問題私のテストデータセットには152のカテゴリがありますが、ログに出力されるのは141の「最終カウンター」だけですか?

私は再帰関数を見て大丈夫だと信じています。そのため、問題はfindSubcategoriesForCategoryID関数のどこかにあると思いますか?

問題についてのフィードバックは、これが私を何時間も維持してくれたので、最もありがたいです。

Webサービスから返されるJSONデータの例:

Node: {
    categoryID = 259;
    categoryTitle = "Engine Parts";
    parentID = 0;   // Parent ID of 0 indicates a root category
}
Node: {
    categoryID = 300;
    categoryTitle = "Camshafts";
    parentID = 259; // Parent ID indicates this category is a subcategory
}
Node: {
    categoryID = 317;
    categoryTitle = "Kent Camshafts";
    parentID = 300;
} 

次のメソッドは、これまでのアプリケーションで使用しているものです。

/**
 *   Kickstarts parsing operation
 */
- (void)parseCategoriesData:(NSArray *)downloadedData {
    NSMutableDictionary *fakeCategory = [NSMutableDictionary dictionary];
    [fakeCategory setObject:[NSNumber numberWithInt:0] forKey:@"categoryID"];

    int counter = 0;
    [self recursiveFunction:downloadedData parentCategory:fakeCategory counter:&counter];

    NSLog(@"Final counter = %d", counter);
}

/**
 *   Recursive function to traverse the passed NSArray
 */
- (void)recursiveFunction:(NSArray *)array parentCategory:(id)parentCategory counter:(int *)i {    
    NSArray *subCategories = [self findSubcategoriesForCategoryID:[[parentCategory valueForKey:@"categoryID"] intValue] categoryData:array];

    for (id object in subCategories) {
        NSLog(@"Node: %@  depth: %d",[object description], *i);
        *i = *i + 1;
        [self recursiveFunction:array parentCategory:object counter:i];
    }
}

/**
 *   Returns an NSArray of subcategories for the passed categoryID
 */
- (NSArray *)findSubcategoriesForCategoryID:(int)categoryID categoryData:(NSArray *)categoryData {
    NSIndexSet *indexsForFilteredCategories = [categoryData indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
        return (BOOL)([[obj valueForKey:@"parentID"] intValue] == categoryID);
    }];

    return [categoryData objectsAtIndexes:indexsForFilteredCategories];
}
4

1 に答える 1

0

再帰関数は問題ないように見えますが、かなり複雑であるため、すべての特殊なケースで実際に機能することを保証できるのはテストのみです。

あなたのアルゴリズムを正しく理解していれば、上から始めて、現在の ID を親 ID として持つアイテムに移動します。したがって、カテゴリ ID として存在しない親 ID が存在する可能性があります

これは非常に簡単にテストできます。

NSArray *allIDs = [downloadedData objectForKey:@"categoryID"];
NSArray *allParentIDs = [downloadedData objectForKey:@"parentID"];

for (NSNumber *x in allParentIDs) {
   if (x.intValue==0) continue;
   NSArray *allChildren = [allIDs filteredArrayUsingPredicate:
     [NSPredicate predicateWithFormat:@"self = %@", x]];
   if (allChildren.count == 0) {
      NSLog(@"There are no category ids for parent id %d.", x.intValue); 
   }      
}
于 2012-11-09T15:49:14.083 に答える