我使用以下代码启动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
操作队列的使用是错误的还是我错过了什么?
答案 0 :(得分:0)
答案 1 :(得分:0)
使用“递归”,即消除for循环并使用计算总请求数的全局变量是一种更好的方法,如此答案of SO
答案 2 :(得分:0)
这种行为的原因是你如何使用`NSOperationQueue:
在for循环中,您实际上入队 N“发送”请求。所有都按顺序执行并按顺序执行。
第一个请求完成后,将执行下一个“发送”请求。由于第一个“发送”请求已完成,您将相应的“sendAck”排队。也就是说,它将附加到队列的尾部,其他“发送”请求仍在等待。
当第二个“发送”请求完成时,将执行下一个“发送”请求,依此类推。由于第二个“发送”请求已完成,因此您将相应的“sendAck”排队等等。
当执行了所有“发送”请求后,第一个“sendAck”请求将被发送。完成后,将执行下一个“sendAck”,并强制执行,直到所有“sendAck”请求最终都被发送。