ios - 如何实现类似UITableView reloadData的东西

标签 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是实际执行加载的 private 函数,并将reloadDataScheduled设置为false。

这似乎在大多数情况下都有效,但是在其他情况下,它似乎会延迟2秒以上,这不是我想要的。

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

最佳答案

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

- (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]reloadData将在runloop上每次获取运行一次。

ps。在SWIFT中

Swift 1.1之前的
  • -禁止使用[NSObject performSelector: withObject: afterDelay:]
  • swift 2.0之后的
  • -现在允许。
  • 关于ios - 如何实现类似UITableView reloadData的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36000768/

    相关文章:

    iphone - UIButton 自定义视网膜图像在 iPad 视网膜显示器中拉伸(stretch)

    ios - 在 iOS 8 中使用自动 UITableViewCell 高度,如果单元格的内容嵌入到 UIView 中,它是否可以工作?

    swift - 当应用程序处于后台模式时发送本地通知不起作用

    ios - Xcode 在您的钥匙串(keychain)中找不到此配置文件的有效私钥证书对

    ios - coretext 从文本字段的底部到顶部显示文本

    ios - 如何像 wallapop 应用程序一样在表格 View 的标题中有一个可伸缩的图像 slider

    IOS:如何在 UIMapView 上显示标签文本值

    ios - 加载表格时 tableView outlet nil

    ios - 类型 'GameScene has no member ' 延迟'

    ios - 在 iPhone 上刷新数据导致系统变得不稳定或无响应