iOS-将异步数据请求返回到ViewController
我有一个包含多个函数的服务,这些函数准备提交给web服务的数据 基本上,我在ViewController中收集数据,将其传递给服务,对其进行操作和转换,然后将该信息传递给负责所有数据传输(GET、POST、PUT、DELETE)的类 即 视图控制器: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(
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);
});