restkit中的有序操作序列

时间:2014-01-15 19:29:01

标签: ios restkit

我使用以下代码启动N个请求,其中每个请求都是由两个请求组成的,这两个请求必须同时进行(我不关心阻止UI,因为我希望应用程序被阻止):

objectManager.operationQueue.maxConcurrentOperationCount = 1;

for (int i = 0; i< n; i++)
{
[objectManager postObject:reqObj
                         path:@"sync.json"
                   parameters:nil 
                      success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                        [operation waitUntilFinished];
                        // Do something and then send the second request
                        [self sendAck];
            } // end success
                    failure:^(RKObjectRequestOperation *operation, NSError *error) {}
];

}

第二个请求非常相似:

 -(void)sendAck
    {
    [objectManager postObject:reqObj
                             path:@"sync.json"
                       parameters:nil
                          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                               [operation waitUntilFinished];

    }
    failure:^(RKObjectRequestOperation *operation, NSError *error) {}
    ]

    }

但是在检查了服务器上的日志后,我意识到所有的“ack”,我的意思是所有第二次请求都在第一次请求之后。结果显然不正确。 如果请求i已启动,我们必须在发送i + 1请求之前等待第二个请求完成。那就是:

req. i, second req. on i, req. i+1, second req. on i+ 1,...

而不是

req .i ,req. i+1, ....., second req. on i, second req. on i+1

操作队列的使用是错误的还是我错过了什么?

3 个答案:

答案 0 :(得分:0)

我从未尝试过这个,但确保以特定顺序调用请求的一种好方法是将它们放在如here所述的队列中。

另一种方法是使调用同步,这是一种很好的方法,here

答案 1 :(得分:0)

使用“递归”,即消除for循环并使用计算总请求数的全局变量是一种更好的方法,如此答案of SO

答案 2 :(得分:0)

这种行为的原因是你如何使用`NSOperationQueue:

在for循环中,您实际上入队 N“发送”请求。所有都按顺序执行并按顺序执行。

第一个请求完成后,将执行下一个“发送”请求。由于第一个“发送”请求已完成,您相应的“sendAck”排队。也就是说,它将附加到队列的尾部,其他“发送”请求仍在等待。

当第二个“发送”请求完成时,将执行下一个“发送”请求,依此类推。由于第二个“发送”请求已完成,因此您相应的“sendAck”排队等等。

当执行了所有“发送”请求后,第一个“sendAck”请求将被发送。完成后,将执行下一个“sendAck”,并强制执行,直到所有“sendAck”请求最终都被发送。