Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何实现UITableView重载数据之类的功能_Ios_Uitableview_Nstimer_Nsrunloop - Fatal编程技术网

Ios 如何实现UITableView重载数据之类的功能

Ios 如何实现UITableView重载数据之类的功能,ios,uitableview,nstimer,nsrunloop,Ios,Uitableview,Nstimer,Nsrunloop,我有一个自定义控件,其数据源类似于UITableView的工作方式。我还添加了一个重载数据函数来加载新数据 我希望每次运行循环调用一次重载数据实现,以避免多次重载相同的数据 这是我当前的实现: func reloadData(){ guard reloadDataScheduled == false else{ return } self.reloadDataScheduled = true NSRunLoop.currentRunLoop().

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

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

这是我当前的实现:

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的延迟或任何关于如何实现这种实现方式的建议。

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

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

斯威夫特诗集

  • 在swift 1.1之前-
    [NSObject performSelector:withObject:afterDelay:][/code>被阻止
  • swift 2.0之后-现在是允许的

这是一个UIView子类,它允许您在
setNeedsDisplay
setNeedsLayout
的基础上进行构建吗?是的,它是一个UIView子类。是的,它似乎按照预期工作。我只是希望我能知道为什么实际的nsrunlop没有。谢谢。-
[self-performSelector:@selector(reloadData)with Object:nil afterDelay:0]
NSRunLoop.currentRunLoop()的便捷方法。performSelector(“reloadData”,目标:self,参数:nil,顺序:0,模式:[NSDefaultRunLoopMode])
您可以使用您想要的任何代码。无论如何,当触发
reloadData
setneedsroaddata
时,您应该取消以前的计划,您将获得更多的运行循环信息