iphone - блок не работает должным образом

У меня есть код, который я пытаюсь написать как блок, ради обучения.

У меня есть этот NSMutableArray, который представляет собой набор объектов NSDictionary. Внутри каждого словаря есть объект NSString, связанный с ключом «время». Я пытаюсь найти, присутствует ли данное время в этом словаре. Если бы я не использовал блоки, я бы сделал это:

for( NSDictionary* obj in allTimes ) {
    double aValue = [[obj objectForKey:@"time"] doubleValue];
    if (time == timeX)
        [self doStuff];
}

с помощью блоков...

__block BOOL found = NO;

[allTimes  enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

double aValue = [[obj objectForKey:@"time"] doubleValue];
NSLog(@"a value=%@", [obj objectForKey:@"time"] );

if (aValue == timeX) {
    *stop = YES;
    found = YES;
}

}];

но это никогда ничего не основывает. Все значения "aValue" равны нулю, а все [obj objectForKey:@"time"] представлены пустыми строками.


person Duck    schedule 08.01.2011    source источник
comment
Проблема может заключаться в том, что вы пытаетесь печатать дважды с помощью %@, вы пытались это отладить?   -  person vodkhang    schedule 08.01.2011
comment
Зарегистрируйте объект. Может быть, по какой-то причине он равен нулю.   -  person ughoavgfhw    schedule 08.01.2011
comment
@vodkhang, нет, я печатаю строковое значение, а не двойное значение aValue.   -  person Duck    schedule 08.01.2011
comment
@ughoavgfhw, я сделал это. Это не ноль.   -  person Duck    schedule 08.01.2011
comment
на самом деле я обнаружил, что блок не перечисляет все объекты в массиве. Просто делает первый объект при каждом проходе... что более странно, чем я думал.   -  person Duck    schedule 08.01.2011
comment
первый объект при каждом прохождении? какие? это не так и не должно. Что такое проход?   -  person vodkhang    schedule 08.01.2011
comment
Правильно ли загружается timeX в блоке? Или, может быть, *stop по умолчанию имеет значение YES и его необходимо установить на NO.   -  person ughoavgfhw    schedule 08.01.2011
comment
@DigitalRobot: если obj является словарем, при его регистрации также будет отображаться его содержимое, чтобы вы могли увидеть, не испортится ли что-то при его извлечении.   -  person ughoavgfhw    schedule 08.01.2011


Ответы (1)


Этот код работает для меня, что не работает для вас? Я сделал что-то не так, воссоздавая вашу проблему?

NSMutableArray *array = [NSMutableArray array];
    NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"hehe" forKey:@"time"];
    NSDictionary *dict2 = [NSDictionary dictionaryWithObject:@"hehe2" forKey:@"time"];                      

    [array addObject:dict1];
    [array addObject:dict2];

    [array  enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        double aValue = [[obj objectForKey:@"time"] doubleValue];
        NSLog(@"a value=%@", [obj objectForKey:@"time"] );
        NSLog(@"aValue = %d", aValue);
    }];
person vodkhang    schedule 08.01.2011
comment
иногда происходят странные вещи - person vodkhang; 09.01.2011