等待网络呼叫完成的正确性 - 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 完成的正确方法?

为啥我的 Ajax 调用的“等待”长度如此之长? (Chrome 网络面板)

等待文件加载和网络请求完成

控制台应用在异步呼叫完成之前终止

iOS 开发 把握AFNet网络请求完成的正确时机

在 iOS 中等待多个网络异步调用