iOS - 将异步数据请求返回给 ViewController

iOS - Returning async data request to ViewController

我有一个服务包含多个函数,这些函数可以准备要提交给 Web 服务的数据。

基本上我在 ViewController 中收集数据,将其传递给服务,对其进行操作和转换,然后将该信息传递给负责所有数据传输的 class (获取,POST,放置,删除)

ViewController:

var model = MyModel()
var service = MyService()

service.createNewDBEntryOnServer(model)

服务:

func createNewDBEntryOnServer(model: MyModel) -> MyModel {

    var jsonToPost = JSONService.modelToJSON(model)

    networkService.post("ext-url", jsonToPost, completion { data, response, error) in {

        //Data returned here from JSONService
        dispatch_async(dispatch_get_main_queue(), {
            //Can return this data to ViewController for processing
        })
    })
    return MyModel()
}

NetworkService 'post' 方法使用 NSURLSession.sharedSession(),并使用 session.dataTaskWithRequest

对 Web 服务执行异步请求

我能够 return 数据很好,但是由于我的 ViewController 和我的 NetworkService 之间有一层,我不确定如何检测与 return 在异步数据请求之前和之后的 MyService 上。在某些情况下,我需要显示一个 UIActivityIndi​​cator,因此我的 ViewController 例如需要在执行 segue 之前等待异步响应。

服务可以 post 通过视图控制器可以列出的 NSNotificationCenter 发出通知,然后从服务中获取数据。如果您在服务中使用委托直接调用视图控制器,那么此时视图控制器可能实际上并不存在(取决于您的 GUI 设计和控制器的生命周期)。

就我个人而言,我自己可能会将服务作为模型的实现细节,并且您的视图控制器从模型请求功能,而模型本身使用服务 class。但这既不是对也不是错,只是我的喜好。

没有理由避免使用通知中心,除了你可能感觉不熟悉,但异步 activity 在完成时使用它是 iOS 中非常常见的模式。 其他模式是使用完成块或委托(即回调)。但是,如果您正在回调 GUI 对象,那么很可能在回调时该对象不存在,因此如果您使用该模式,则需要进行检查以处理这种情况。

createNewDBEntryOnServer中添加完成回调参数怎么样?所以:

var model = MyModel()
var service = MyService()

var queued = service.createNewDBEntryOnServer(model, completion {model} in {
  // this is called asynchro
  waiterPopup.dismiss();

  self.updateModel(model);
});

if (queued)
        waiterPopup.show();

注意:为了在调用回调之前摆脱可能的控制器处理,使用指向自身的弱指针,如:

var queued = service.createNewDBEntryOnServer(model, completion {model} in {
  // this is called asynchro
  if (!weakSelf)
     return;

  weakSelf.dismissWaiter();
  weakSelf.updateModel(model);
});