2014-01-15 65 views
1

我使用下面的代码来启动N个请求,其中每个请求都是由两个必须手持的请求组成的(我不关心阻止UI,因为我希望应用程序被阻止):restkit中的操作顺序

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

_“我不在乎阻止用户界面,因为我想阻止应用程序”_用户不会 - 苹果可能会拒绝它。 – CouchDeveloper

+0

'[operation waitUntilFinished]'可能没有效果,因为当完成处理程序将被执行时,操作总是完成。我想念什么? – CouchDeveloper

+0

该操作是一个同步过程,不能被阻止。 – giuseppe

回答

0

我从来没有尝试过这种方法,但确保您按特定顺序调用请求的一种好方法是将它们放入队列中,如here所述。

另一种方法是使呼叫同步,一个很好的方法来描述here

+0

第一个链接与我的代码完全相同,如果你检查了什么postObject你会注意到它排队请求,就像在文档中一样。 – giuseppe

0

使用“递归”,即消除了环路,并使用全球variabile的,其对总的请求数是一个更好的办法,因为在这个答案of SO

0

这样做的原因行为,你如何使用`NSOperationQueue:

在for循环中,您实际上是enqueueing N“发送”请求。所有按顺序和顺序执行。

当第一个请求完成时,下一个“发送”请求将被执行。由于第一个“发送”请求已完成,你入队对应的“sendAck”。也就是说,将附加到到队列尾部,其他“发送”请求仍在等待。

当第二个“发送”请求完成时,下一个“发送”请求将被执行,依此类推。由于第二次“发送”请求已经完成,你入队对应的“sendAck”等强制。

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

+0

而哪个解决方案可以获得我想要的? – giuseppe

+0

@giuseppe首先,不要运行for循环。相反,将请求(或URL和params)作为对象放入NSMutableArray。启动第一个请求并从阵列中删除它。在完成处理程序中,从数组中删除第一个(现在是第二个),并从第一个请求开始该请求和相应的确认。这看起来像一个递归,但事实上并非如此。 – CouchDeveloper

+0

好的,我会试试。 – giuseppe