将未知延迟的后续事件分组

时间:2012-02-15 16:17:20

标签: iphone objective-c ios uitableview nstimer

我正在开发类似iPhone的应用程序,我正面临一个问题"。

我收到了联机或离线联系人的活动,但我不知道这些更新何时开始或结束。 我知道通常连接事件将在前一个事件之后不超过0.2秒。无论如何,如果它来得晚,我真的不在乎。

当我将所有事件分组后,我会更新我的tableview以显示联系人的新状态。 (一旦我收到连接事件,我之前就更新了我的tableview,但现在我开始处理很多联系人了,这不再合适了)

鉴于缺少开始/结束更新信息,我设置了一个基于计时器的检查系统,其执行如下:

- (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 个答案:

答案 0 :(得分:1)

也许您可以排队收到的任何通知,并且有一个运行的计时器(可能每隔几秒)并更新自上次触发以来收到的所有/所有通知。

通过这种方式,您可以使用单个计时器获得相当好的响应能力。