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 上。在某些情况下,我需要显示一个 UIActivityIndicator,因此我的 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);
});
我有一个服务包含多个函数,这些函数可以准备要提交给 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 上。在某些情况下,我需要显示一个 UIActivityIndicator,因此我的 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);
});