当前位置: 首页 > 面试题库 >

检查来自Alamofire和Swift的多个异步响应

游高杰
2023-03-14
问题内容

我正在编写一个依赖于来自各种站点/服务的数据的应用程序,并且涉及基于这些不同来源的数据执行计算以产生最终产品。

我编写了一个示例类,下面带有两个函数,该函数从两个来源收集数据。我选择使功能不同,因为有时我们会根据源应用不同的身份验证方法,但是在本示例中,我只是将它们简化为最简单的形式。这两个功能都使用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函数中的第一个闭包中,但是,我认为这不是最佳实践,实际上我是从两个以上的来源中提取的,所以闭包的深度为n个闭包。

找出有助于检查多个数据源是否给出有效响应的最佳方法的任何帮助,并对其进行适当处理将不胜感激。


问题答案:

比那个阻塞html" target="_blank">线程的循环过程更好,您可以使用调度组来跟踪请求的完成时间。因此,在发出每个请求之前先“进入”该组,在完成请求后“离开”该组,并设置一个“通知”阻止/关闭,当该组的所有任务都完成时将被调用。

例如,在Swift 3中:

let group = DispatchGroup()

group.enter()
retrieveDataFromURL(url1, parameters: firstParameters) {
    group.leave()
}

group.enter()
retrieveDataFromURL(url2, parameters: secondParameters) {
    group.leave()
}

group.notify(queue: .main) {
    print("both requests done")
}

或者,在Swift 2中:

let group = dispatch_group_create()

dispatch_group_enter(group)
retrieveDataFromURL(url1, parameters: firstParameters) {
    dispatch_group_leave(group)
}

dispatch_group_enter(group)
retrieveDataFromURL(url2, parameters: secondParameters) {
    dispatch_group_leave(group)
}

dispatch_group_notify(group, dispatch_get_main_queue()) {
    print("both requests done")
}

另一种方法是将这些请求包装在异步NSOperation子类中(使它们可取消,使您可以控制并发程度的控制等),但这更加复杂,因此您可能要从如上所述的调度组开始。



 类似资料:
  • 我的任务是简单地制作一个控制器,当它们准备好时立即给我结果(下面的简单示例) 我想得到字符串的确切数量(例如1000个字符串,以某种方式为1秒)(实际上我需要得到func的结果,但为了简化任务,只是字符串) 因此,当我在控制器中收到一些请求时,我希望它能以这种方式在它们准备好后尽快给出答案(无需缓冲结果): 1秒钟 “一些绳子”- 1秒钟 “另一个”- 1秒钟 “第三个”- 1000秒 “一些绳子

  • 我想返回一个临时重定向,使用AsyncACK。 下面的“工作”(因为没有错误),但似乎不是异步的(它一次处理一个请求)。 这应该工作吗?如果我明确需要像https://jersey.github.io/documentation/latest/async.html#d0e9895一样启动一个新线程,返回响应是什么样子的?

  • 我有一个actor可以从外部系统(UDP/TCP)接收消息。根据传入数据的内容,有时我希望actor回调代码的非AKA部分。 换句话说,我不想用调用和actor并等待一些传入数据,而是异步回调。 我如何实现这一点而不关闭调用对象(在创建ActorRef时会在回调中传递琐碎的内容,但这会捕获调用者)?

  • 问题内容: 对不起,我的英语不好 :) 我在iOS应用程序的Swift中通过Alamofire解析JSON响应时遇到问题。我编写了一个函数来返回JSON响应字符串。请求和响应处理我做Alamofire和JSON处理我做SwiftyJSON。首先,我声明一个名为 jsonString的变量 ,其值为 test 。然后,我向REST服务发出请求,并通过单击按钮获得JSON响应。我想使用函数 ping(

  • 我想运行所有这些查询到neo4j,我可以成功地运行一个密码查询会话,但对于多个查询,它显示错误。我还需要个别查询的JSON格式的结果。有什么帮助吗? //此查询的示例结果

  • 问题内容: 如何检索请求的响应标头?以下是我提出的要求。 提前致谢! 问题答案: 如果响应为类型,则可以从获取标头。 因此,当您使用Alamofire responseJSON时,可以像这样访问NSHTTPURLResponse属性: 正如苹果文件所说: 包含所有HTTP标头字段的字典,该字段作为服务器响应的一部分收到。通过检查此词典,客户端可以看到HTTP服务器返回的“原始”标头信息。 该词典中