Как использовать NSTimer внутри петли для iphone? - PullRequest
0 голосов
/ 01 ноября 2011

Я очень новичок в разработке приложений для iPhone. Добавляю события в iCal из моего приложения для iphone. Пользователь может добавить несколько событий одновременно в iCal из приложения. Если пользователь добавил более 50 событий в iCal, событие не будет добавлено в iCal, и приложение получит сбой. Итак, я хочу избежать сбоя приложения. Итак, я планировал отложить событие добавления в iCal внутри цикла for (пока цикл находится в рабочем состоянии). Как я могу приостановить цикл For и продолжить цикл for после 10-секундной задержки. Между тем цикл for должен продолжаться через 10 секунд после того, как он был приостановлен. Как я могу это сделать? Есть идеи? Пожалуйста, помогите решить мою проблему? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Лучший способ сделать то, что вам нужно - это NSOperationQueue, но он немного технический.Примерно так может быть легче понять:

Заголовок:

NSMutableArray *events;

Когда вы указываете свой список событий:

events = /*....*/;
[self nextOp];

Метод nextOp:

-(void)nextOp {
    // Do 10 events at a time.
    int stop = MIN(10,[events count]);
    for (int i = 0; i < stop; i++) {
        //Add [events objectAtIndex:i] to iCal
    }

    // Remove these processed events.
    [events removeObjectsInRange:NSMakeRange(0,stop)];
    if ([events count] > 0) {
        // We've still got more events to go, so schedule our next call
        [self performSelector:@selector(nextOp) withObject:nil afterDelay:10];
    } else {
        [events release];
        events = nil;
    }
}
0 голосов
/ 01 ноября 2011

Вы должны не делать паузы в iOS. Если вы не можете завершить свою обработку быстро и синхронно, вы должны выйти из цикла и выйти из метода, содержащего цикл.

Чтобы завершить обработку вашего цикла, ваше приложение должно начать другую итерацию цикла позже, например, с помощью обратного вызова из делегата завершения, таймера, executeselector или очереди операций. Последние методы могут включать задержку. Для этого вам нужно знать, как неструктурировать циклы и как сохранить локальное состояние. Выход из цикла с обратным вызовом на месте примерно эквивалентен отложенному оператору GOTO.

Чтобы вызов NSTimer был полезен при обработке цикла, вам необходимо выйти из цикла и метода, поскольку только тогда будет вызываться селектор обратного вызова таймера.

...