Группировка последующего события с неизвестной задержкой - PullRequest
0 голосов
/ 15 февраля 2012

Я разрабатываю приложение для iPhone, похожее на Skype, и сталкиваюсь с «проблемой».

Я получаю события для контактов, которые подключаются к сети или отключаются, но я не знаю, когда эти обновления начнутся иликонец.Я знаю, что обычно событие подключения происходит не позднее, чем через 0,2 секунды после предыдущего события.И в любом случае, если это произойдет позже, мне все равно.

Когда все события сгруппированы, я обновляю свой просмотр таблицы, чтобы показать новый статус контактов.(Ранее я обновлял свой просмотр таблицы, как только получаю событие подключения, но теперь, когда я начинаю работать с большим количеством контактов, это больше не подходит)

Учитывая отсутствующую информацию начала / конца обновления, которую я настроилсистема проверки на основе таймера, которая выполняет следующие действия:

- (void)connectionStatusEventReceivedForContact:(Contact *)aContact {
    if (!isUpdating) {
        [self willStartToUpdateContacts];
    }
    newUpdateReceived = TRUE;

    NSIndexPath *indexPathToUpdate = [delegate indexPathOfContact:aContact];
    if (indexPathToUpdate != nil  && ![indexPathsOfContactToUpdate containsObject:indexPathToUpdate]) {
        [indexPathsOfContactToUpdate addObject:indexPathToUpdate];
    }
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(newUpdateReceived:) userInfo:nil repeats:NO];
}

- (void)willStartToUpdateContacts {
    isUpdating = TRUE;
}

- (void)newUpdateReceived:(id)sender {
    [self isLastUpdate:nil];
    [NSTimer scheduledTimerWithTimeInterval:0.6 target:self selector:@selector(updateNewUpdateBoolean:) userInfo:nil repeats:NO];
}

- (void)updateNewUpdateBoolean:(id)sender {
    newUpdateReceived = FALSE;
    lastUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(isLastUpdate:) userInfo:nil repeats:NO];
}

- (void)isLastUpdate:(id)sender {
    if (!newUpdateReceived) {
        [self didUpdateContacts];
    }
    newUpdateReceived = TRUE;
}

Как видите, это немного сложно, меня беспокоит то, что, когда у меня 500 контактов, запланировано 1001 таймер.И это не очень хорошее решение.Я думаю, как мне это сделать, но пока не нашел решения, которое мне действительно нравится.Я уверен, что кто-то из вас поможет мне найти лучшее решение: D

Спасибо, ребята

1 Ответ

1 голос
/ 15 февраля 2012

Возможно, вы могли бы поставить в очередь любые полученные вами уведомления и иметь один таймер, который запускается (возможно, каждые пару секунд) и обновляет все / все уведомления, полученные с момента его последнего запуска.

Таким образом, вы получите довольно хорошую отзывчивость, используя один таймер.

...