【问题标题】:Restkit "cancelAllObjectRequestOperationsWithMethod" on Already Running Request/MappingRestkit“cancelAllObjectRequestOperationsWithMethod”已经在运行请求/映射
【发布时间】:2016-07-28 23:58:06
【问题描述】:

我正在使用 Restkit (0.20.3),编译到 iPhone 5s (8.4) 模拟器上。

所以我看到很多关于“cancelAllObjectRequestOperationsWithMethod”的帖子,以便取消请求。我目前有一个带有大型 JSON 包的请求,需要几秒钟才能映射到 CoreData。用户可以选择通过按钮手动取消请求。

如果我的理解是正确的,这个“cancelAllObjectRequestOperationsWithMethod”是否应该停止请求,即使它当前正在运行?如果没有,那么我的问题是如何去做。但是,如果这应该停止当前操作,那么根据日志,它似乎不起作用,因为我仍然看到很多用于映射相关 API 的打印语句。

这是我启动 API 的代码:

@try{
        [[RKObjectManager sharedManager] getObjectsAtPath:path
                                               parameters:nil
                                                  success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {}                                                     failure:^(RKObjectRequestOperation *operation, NSError *error) {}
@catch(NSException *e) {
    NSLog(@"%@", e);
}

这是我的取消代码,当用户按下按钮时:

NSLog(@"%@", [[RKObjectManager sharedManager] enqueuedObjectRequestOperationsWithMethod:RKRequestMethodAny matchingPathPattern:path]);
[[RKObjectManager sharedManager] cancelAllObjectRequestOperationsWithMethod:RKRequestMethodAny matchingPathPattern:path];
NSLog(@"%@", [[RKObjectManager sharedManager] enqueuedObjectRequestOperationsWithMethod:RKRequestMethodAny matchingPathPattern:path]);

第一个NSLog显示state: Executing, isCancelled=NO

第二个NSLog显示state: Executing, isCancelled=YES

所以我已成功取消它,但映射仍继续显示在我的日志中。是否有可能在那个时间点也停止它的执行

【问题讨论】:

    标签: ios objective-c iphone core-data restkit


    【解决方案1】:

    它会停止,但不会立即停止。日志也需要时间来打印,并且来自多个不同的线程,因此您不能 100% 依赖某些项目的顺序。

    当您取消操作时,您只是设置了一个标志,由该操作检查该标志并停止。每个操作选择不同的时间(或一组时间)来检查基于他们做什么以及他们如何做。因此,当您取消时,无论操作在内部做什么,它都会完成,然后它会在稍后停止。

    其中一个关键是未来取消的操作甚至不会启动,当前取消的操作也不会调用完成处理程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      相关资源
      最近更新 更多