Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios restkit中的有序操作序列_Ios_Restkit - Fatal编程技术网

Ios restkit中的有序操作序列

Ios restkit中的有序操作序列,ios,restkit,Ios,Restkit,我使用以下代码启动N个请求,其中每个请求都由两个请求组成,这两个请求必须同时进行。我不介意阻止UI,因为我希望阻止应用程序: objectManager.operationQueue.maxConcurrentOperationCount = 1; for (int i = 0; i< n; i++) { [objectManager postObject:reqObj path:@"sync.json"

我使用以下代码启动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) {}
];

}
但是在检查了服务器上的日志之后,我意识到所有的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

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

我从未尝试过这样做,但确保您按特定顺序调用请求的一个好方法是将请求放入所述的队列中


另一种方法是使调用同步,下面介绍了一种很好的方法。

使用递归,即消除for循环并使用一个计算总请求数的全局变量是一种更好的方法,如下面的回答所示。

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

在for循环中,您有效地将N个发送请求排队。所有操作都是按顺序执行的

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

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


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

第一个链接执行与我的代码相同的操作,如果您检查postObject的功能,您将注意到它已将请求排入队列,正如在文档中一样。我不在乎阻止UI,因为我希望用户不会阻止应用程序-苹果可能会拒绝它。[operation waitUntilFinished]可能没有效果,因为在执行完成处理程序时,操作总是完成的。我错过了什么吗?该操作是一个同步过程,不能被阻止。哪种解决方案可以得到我想要的东西?@giuseppe首先,不要运行for循环。相反,将请求或URL和参数作为对象放入NSMutableArray中。启动第一个请求并将其从阵列中删除。在完成处理程序中,从数组中删除第一个,现在是第二个,并从第一个请求中启动该请求和相应的ack。这看起来像一个递归,但实际上不是。
req .i ,req. i+1, ....., second req. on i, second req. on i+1