Alamofire串行请求

时间:2016-01-21 21:08:26

标签: ios alamofire

我需要按顺序执行请求,尽管这不能使用Alamofire。

我想按顺序打印1到30(假设响应只是参数的回声)

SKSpriteNode *laser = [SKSpriteNode spriteNodeWithImageNamed:@"laser"];
laser.physicsBody = [SKPhysicsBody bodyWithTexture: laser.texture size: laser.texture.size];

static const CGFloat thrust = 0.10;
CGVector thrustVector = CGVectorMake(thrust*cosf(laserDirection),
                           thrust*sinf(laserDirection));
[laser.physicsBody applyForce:thrustVector];

2 个答案:

答案 0 :(得分:7)

根据NSURLSessionConfiguration的文档:

  

此属性确定基于此配置的会话中的任务对每个主机进行的最大同时连接数。

     

此限制是针对每个会话的,因此如果您使用多个会话,则您的应用整体可能会超出此限制。此外,根据您与Internet的连接,会话可能会使用低于您指定的下限。

     

OS X中的默认值为6,iOS中的默认值为4。

如您所见,此设置仅控制网络级别的连接数。使用NSURLSession对Alamofire作为基础的一系列请求进行排队后,可以通过该类来确定您的请求何时生效。使用NSURLSession或Alamofire无法保证请求的顺序,而无需以这种方式对其进行显式编码。

也就是说,通过将请求包装在NSOperation中,您可以获得所需的行为。如果您创建NSOperationQueue .maxConcurrentOperationCount 1,则基本上创建一个串行队列。然后使用你已经写过的相同循环,你应该能够像这样包装你的Alamofire请求:

queue.addOperationWithBlock {
    manager.request(.GET, "http://httpbin.org/get", "i" : i], encoding: .JSON)
        .responseJSON { response in
            switch (response.result){
            case .Failure(let error):
                print("error")
                break;
            case .Success(let json):
                print(json)
            }
     })
}

.maxConcurrentOperationCount 1,队列应该按顺序行动,正如我所提到的。因此,根据NSOperationQueue的文档,您的操作将按照添加到队列的顺序执行。所以你应该看到你想要的1到30个结果。

所有这些都说,对于你想要解决的问题,可能有更好的解决方案,除非这只是一个编码练习,以便按顺序获得这些结果。

答案 1 :(得分:1)

正如Alamofire's Github page所述:

  

Alamofire中的网络是异步完成的。对于不熟悉这个概念的程序员来说,异步编程可能会让人感到沮丧,但是这样做有very good reasons

因此,就使用Alamofire而言,您将获得异步网络呼叫。您可以选择不同的库或使用基本SDK实现,但正如Alamofire的Github页面的Apple文档链接中所详述的那样,您可能会发现几乎每个网络库都是异步的。

所以,为了让你了解它,Alamofire的界面同步接收你的电话,但是过去,我们无法保证你的回复会有什么顺序。他们可能会以不同的顺序发出请求他们几乎肯定会以不同的顺序返回答案。

这里更好的选择是存储一个可变的响应数组,一旦它从你做的每个网络调用中存储一个响应,就对数组进行排序,然后进行打印。