Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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-将异步数据请求返回到ViewController_Ios_Swift_Web Services_Asynchronous_Uiviewcontroller - Fatal编程技术网

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

iOS-将异步数据请求返回到ViewController,ios,swift,web-services,asynchronous,uiviewcontroller,Ios,Swift,Web Services,Asynchronous,Uiviewcontroller,我有一个包含多个函数的服务,这些函数准备提交给web服务的数据 基本上,我在ViewController中收集数据,将其传递给服务,对其进行操作和转换,然后将该信息传递给负责所有数据传输(GET、POST、PUT、DELETE)的类 即 视图控制器: var model = MyModel() var service = MyService() service.createNewDBEntryOnServer(model) 服务: func createNewDBEntryOnServer(

我有一个包含多个函数的服务,这些函数准备提交给web服务的数据

基本上,我在ViewController中收集数据,将其传递给服务,对其进行操作和转换,然后将该信息传递给负责所有数据传输(GET、POST、PUT、DELETE)的类

视图控制器:

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服务执行异步请求


我可以很好地返回数据,但由于ViewController和NetworkService之间存在一个层,因此我不确定如何检测异步数据请求前后MyService返回的差异。在某些情况下,我需要显示UIActivityIndicator,例如,我的ViewController在执行segue之前需要等待异步响应。

服务可以通过NSNotificationCenter发布通知,视图控制器可以将其列出,然后从服务中获取数据。如果您在服务中使用委托直接调用视图控制器,则视图控制器可能在该点上实际上不存在(取决于您的GUI设计和控制器的使用寿命)

就我个人而言,我可能会让服务成为模型的一个实现细节,您的视图控制器从模型请求功能,模型本身使用服务类。但这既不是对的也不是错的,只是我的偏好

没有理由避免使用NotificationCenter,除了您可能觉得它不熟悉之外,但异步活动在完成时使用它是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();

注意:为了在调用回调之前消除可能的控制器处理,请使用指向self的弱指针,如:


我的方法是在iOS中做事情的典型方式吗?我在.NET中大量使用这种设计模式,但这是用于同步连接的。有没有更好的办法避免使用NSNotificationCenter?我补充了几句话作为对你评论的回应。
var queued = service.createNewDBEntryOnServer(model, completion {model} in {
  // this is called asynchro
  if (!weakSelf)
     return;

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