需要为 UIRefreshControl 实现超时机制。

Posted

技术标签:

【中文标题】需要为 UIRefreshControl 实现超时机制。【英文标题】:Need to implement timeout mechanism for UIRefreshControl. 【发布时间】:2012-10-09 20:55:21 【问题描述】:

Apple 在 ios 6 中的新 UIRefreshControl 是一个受欢迎的新功能,但似乎没有内置超时机制。

这就是我需要它的场景:

假设用户拉动刷新。它进入旋转模式,而代码尝试从服务器获取数据。服务器不响应,将导致纺车永远旋转。所以,应该有一个超时机制来阻止它。

实现它的最佳方式是什么?

【问题讨论】:

【参考方案1】:

首先根据您需要的时间设置一个计时器。要求它检查以下内容。

您可以使用以下属性检查一段时间后是否仍然刷新

@property (nonatomic, readonly, getter=isRefreshing) BOOL 刷新

如果是,那么您可以使用停止它

结束刷新

类似:

-(void)checkAndStop 如果(刷新控制。刷新 == 是) // 如果需要,显示警报 [refreshControl endRefreshing];

【讨论】:

这不是有问题吗?如果您将计时器设置为 5 秒会怎样。用户拉下 UIRefreshControl(启动计时器),2 秒后正常结束。再过 2 秒后,用户再次拉下 UIRefreshControl。 1 秒后,原始计时器达到 5 秒,即使任务未完成执行,也会调用 endRefreshing。我是不是误会了什么?【参考方案2】:

还可以考虑使用 dispatch_after,这可能比创建 NSTimer 消耗更少。

int64_t delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
    code to be executed on the main queue after delay
);

【讨论】:

【参考方案3】:

我已经实现了使用 NSTimer 来结束刷新:

    [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(handleDataRefreshFailure:) userInfo:nil repeats:NO];

【讨论】:

【参考方案4】:

Swift 版本:

let delayInSeconds: UInt64 = 2
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * NSEC_PER_SEC))
dispatch_after(popTime, dispatch_get_main_queue(), 
     if refreshControl.refreshing 
        refreshControl.endRefreshing()
     
   )

【讨论】:

以上是关于需要为 UIRefreshControl 实现超时机制。的主要内容,如果未能解决你的问题,请参考以下文章

在 UIViewController 上居中 UIRefreshControl

实现一个水平的 UIRefreshControl

UITableView - 带有背景图像的 UIRefreshControl

UIRefreshControl 需要下拉太远

UIRefreshControl:刷新时 UITableView '卡住'

为啥我不能为 CDTVC 中的私有 UIRefreshControl 属性创建 Getter?