尝试根据与用户默认值的比较来枚举数组和选择对象

时间:2012-05-07 19:39:56

标签: objective-c cocoa-touch nsarray objective-c-blocks

我有一系列字典,代表抽认卡。其中一个键值对是pgFinishedNumber以及闪存卡在工作簿中出现的页面。用户还在应用中设置了一个值pagesDone,以跟踪他们在工作簿中的进度。

我使用Block来浏览主闪卡阵列并将卡添加到另一个名为myDailyArray的阵列。我想要移动页码大于pagesDone值的抽认卡,但我有两个问题。

当多个闪存卡具有相同的页码时,会出现第一个问题。发生这种情况时,myDailyArray中只包含第一张卡片。当用户指示他在没有新闪存卡的页码上时,会出现第二个问题。发生这种情况时,阵列中的下一张闪存卡会提前添加。

我的块的代码位于viewWillAppear:中,如下所示:

- (void)viewWillAppear:(BOOL)animated {

//......some code

[theLevelArray.level1Array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
NSMutableDictionary *dictDaily = [theLevelArray.level1Array objectAtIndex:idx];

[self.myDailyArray addObject:dictDaily];

int pgFinishedNumber = [[dictDaily objectForKey: @"pgFinishedNumber"] intValue];

if (pagesDone <= pgFinishedNumber)
    {
        *stop = YES;
    }  
}]; 

例如,工作簿的第3页介绍了两个抽认卡。这两张卡的NSDictionary都有3作为pgFinishedNumber的值。当我在用户默认3中输入pagesDone然后运行该应用时,只会将这两个中的第一个添加到myDailyArray。当我将pagesDone更改为4时,不仅会将pgFinishedNumber值为“3”的两个抽认卡添加到myDailyArray,还会将下一个< / em> object,其pgFinishedNumber值为5!我很神秘。

1 个答案:

答案 0 :(得分:1)

当达到大于或等于pagesDone的第一个页码时,您将停止迭代。这意味着任何后续页面可能具有相同的页码,将被忽略。

pgFinishedNumber大于(但不等于)pagesDone时,您应该停止迭代,并将if语句移动到块的顶部(在添加页面之前)。

我认为这也应该解决你的第二个问题,我认为if语句的结果是在块的末尾。

这样的事情应该有效:

NSArray *levelArray = [NSArray arrayWithObjects:
        [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1], @"pgFinishedNumber", nil],
        [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:2], @"pgFinishedNumber", nil],
        [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:3], @"pgFinishedNumber", nil],
        [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:5], @"pgFinishedNumber", nil], nil];

NSMutableArray *myDailyArray = [NSMutableArray array];
int pagesDone = 4;
[levelArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
    NSMutableDictionary *dictDaily = (NSMutableDictionary *)obj;
    int pgFinishedNumber = [[dictDaily objectForKey: @"pgFinishedNumber"] intValue];
    if (pagesDone < pgFinishedNumber) {
        *stop = YES;
    } else {
        [myDailyArray addObject:dictDaily];
    }
}];
NSLog(@"%@", myDailyArray);