如何实现UITableView reloadData之类的东西

时间:2016-03-15 00:44:01

标签: ios uitableview nstimer nsrunloop

我有一个自定义控件,其数据源类似于UITableView的工作方式。我还添加了一个reloadData函数来加载新数据。

我希望每个运行循环调用一次重载数据实现,以避免多次重新加载相同的数据。

这是我目前的实施:

func reloadData(){
    guard reloadDataScheduled == false else{
        return
    }

    self.reloadDataScheduled = true
    NSRunLoop.currentRunLoop().performSelector("innerReloadData", target: self, argument: nil, order: 0, modes: [NSDefaultRunLoopMode])
}

innerReloadData是一个实际加载的私有函数,并将reloadDataScheduled设置为false。

这似乎大部分时间都有效,但其他情况似乎延迟超过2秒,这不是我想要的。

我需要深入了解runloop的延迟或者有关如何实现这种实现方式的任何建议。

1 个答案:

答案 0 :(得分:3)

在这种情况下,我通常会使用以下代码。

- (void)setNeedsReloadData
{
    // cancel all previous schedules
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(reloadData) object:nil];

    // below codes schedule "immediately run after current fetching on runloop"
    [self performSelector:@selector(reloadData) withObject:nil afterDelay:0];
}
- (void)reloadData
{
    // cancel the others schedules
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(reloadData) object:nil];

    // Reload Data
    ...
}

你可以随时随地拨打-[XXX setNeedsReloadData]。 每次在runloop上获取时,reloadData将运行一次。

PS。在SWIFT

  • 在swift 1.1之前 - [NSObject performSelector: withObject: afterDelay:]被阻止了。
  • 在swift 2.0之后 - 现在允许。