等待网络呼叫完成的正确性 - iOS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了等待网络呼叫完成的正确性 - iOS相关的知识,希望对你有一定的参考价值。
我很好奇,当用户在等待网络调用完成时,在取消现有的非确定性请求时,他们的用户体验如何。让我补充更多的背景。我正在为我的应用预取数据,以后会用到。当用户点击按钮时,我们使用这些数据来加载一个屏幕。我们希望给用户更好的用户体验,而不是向用户展示一个旋转器,并等待网络调用完成。
class TestInteractor
var currentTask: HTTPTask?
var content: SomeContent?
func getData(_ id: String, completion: Result<SomeContent, Error>)
currentTask = URLSession.shared().dataTask(with: request)
// check for no error
// set content here
var hasContent: Bool
return content != nil
这里有一个问题,如果预取还在进行中(由于网络不好),我应该让用户等待这个调用完成,还是直接取消任务,重新开始一个新的调用。
取消现有的网络调用可以按照下面的方法实现。
func getData(_ id: String)
if let task = currentTask
task.cancel()
currentTask = nil
// Continue with a new network call
或者我是否应该在调用中添加一个新的属性 TestInteractor
并检查网络是否仍在进行中并等待?
var isNetworkCallInProgress: Bool
return currentTask?.state == running
网络请求还没有完成的原因可能有很多,你的服务器可能有点不堪重负;客户端的网速可能有点慢。如果中止工作,重新开始,可能是一种浪费。谁又能说重启任务就能改变当前的任何阻碍呢。
我想说的是,在运行中的任务上等待,直到它完成。如果预取在我们需要之前完成,很好,预取节省了时间。但如果在我们需要的时候还没有完成,如果让它完成,那还是比重启它节省时间(重启的任务不会因为我们重启了就神奇地比之前的任务快),所以在这种情况下,预取也是有用的。所以,让请求完成,就是让预取机制的效用最大化。另外,如果你因为预取无法及时完成而选择重启一个任务,如果你的平均用户其实比你这个请求的平均服务时间还要快呢?唉,谁知道呢,最后你可能会把平均情况下的服务器负载增加一倍。最好你的设计是和这样的事情脱钩的。
你可以给用户一个选择,你可以添加一个刷新按钮来重置呼叫,或者让他们等待。
如果你想问他们是否正常,你可以直接推送一个警报,询问他们是否要刷新呼叫,同时在后台运行预取。
let alert = UIAlertController(title: "Message Title", message: "body text", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "button", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
这是警报的代码。我个人会先检查一下,看看这个过程是否耗时较长,然后推送出警报,要求他们刷新或者等待。
首先,你的应用有一个网络活动指标。做一个计数器,记录你启动了多少个网络任务,有多少个已经完成,当计数从0到1或者从1到0变化时,开启或者关闭网络活动指示器,这样就能很好的显示网络活动。
其次,在你的数据模型中,你会有数据正确的项目、正在加载的项目和没有加载的项目。编写代码来显示每一种项目。当一个网络请求完成后,它会更新你的数据模型,这就会重新绘制相应的项目。
以上是关于等待网络呼叫完成的正确性 - iOS的主要内容,如果未能解决你的问题,请参考以下文章
等待 iOS Swift CBPeripheralDelegate 完成的正确方法?