我正在编写一个应用程序,该应用程序依赖于来自各个站点/服务的数据,并涉及基于这些不同来源的数据执行计算以生成最终产品。
我编写了一个示例类,其中包含两个函数,从两个不同的来源收集数据。 我选择使这两个函数不同,因为有时我们会根据来源应用不同的身份验证方法,但在此示例中,我仅将它们简化为最简单的形式。 这两个函数都使用Alamofire启动和处理请求。
然后我有一个初始化函数,如果成功从两个来源收集数据,则加载另一个nib文件,否则等待最多四秒钟,如果没有返回响应,则加载一个服务器错误nib文件。
我尽可能地让这个示例变得简单。 基本上,这是我想要遵循的逻辑。 不幸的是,目前的实现方式似乎不能正常工作。
import Foundation
class GrabData{
var data_source_1:String?
var data_source_2:String?
init(){
// get data from source 1
get_data_1{ data_source_1 in
println("\(data_source_1)")
}
// get data from source 2
get_data_2{ data_source_1 in
println("\(data_source_1)")
}
var timer = 0;
while(timer<5){
if((data_source_1 == nil) && (data_source_2 == nil)){
// do nothing unless 4 seconds has elapsed
if (timer == 4){
// load server error nib
}
}else{
// load another nib, and start manipulating data
}
// sleep for 1 second
sleep(1)
timer = timer+1
}
}
func get_data_1(completionHandler: (String) -> ()) -> () {
if let datasource1 = self.data_source_1{
completionHandler(datasource1)
}else{
var url = "http://somewebsite.com"
Manager.sharedInstance.request(.GET, url).responseString {
(request, response, returnedstring, error) in
println("getting data from source 1")
let datasource1 = returnedstring
self.data_source_1 = datasource1
completionHandler(datasource1!)
}
}
}
func get_data_2(completionHandler: (String) -> ()) -> () {
if let datasource2 = self.data_source_2{
completionHandler(datasource2)
}else{
var url = "http://anotherwebsite.com"
Manager.sharedInstance.request(.GET, url).responseString {
(request, response, returnedstring, error) in
println("getting data from source 2")
let datasource2 = returnedstring
self.data_source_2 = datasource2
completionHandler(datasource2!)
}
}
}
}
我知道我可以将第二个闭包放在init函数内部的第一个闭包中,但是我认为这不是最佳实践,并且我实际上是从超过2个源头提取数据,因此闭包将有n层深度。
如果有帮助来找出检查多个数据源是否给出有效响应的最佳方法,并适当地处理它,将不胜感激。