iOS MKNetworkOperation - 如何重试上一次操作?

时间:2013-08-30 12:04:24

标签: ios objective-c

我正在尝试实现刷新功能。我有多种类型的操作填充我的tableview,我只想重新运行最后一次操作。

我有这个属性:

 @property (nonatomic, strong) GetRouteOperation* refreshOperation;

RouteOperation继承自MKNetworkOperation,并且是不同类型的RouteOperations的超类,例如“获取半径中的路线”,“按城市获取路线”等。

我正在初始化这样的操作:

GetRoutesWithinDistanceOperation *operation = [[GetRoutesWithinDistanceOperation alloc] initOperation];

[self refreshRoutesWithOperation:operation];

我正在运行这样的操作:

- (void)refreshRoutesWithOperation:(GetRouteOperation *)operation
{

self.refreshOperation = [operation copyForRetry];

[operation getRoutesCompletionHandler:^(NSArray *routes) {
    self.routes = routes;
    [self.tableView reloadData];
} errorHandler:^(NSError *error) {

} notModifiedHandler:^{

}];
}

它在我第一次获取数据时起作用。

当我尝试像这样刷新表格时:

    [self refreshRoutesWithOperation:self.refreshOperation];

我在MKNetworkOperation类的此方法中遇到异常:

-(void) addCompletionHandler:(MKNKResponseBlock)response errorHandler:(MKNKResponseErrorBlock)error {

  if(response)
    [self.responseBlocks addObject:[response copy]];
  if(error)
    [self.errorBlocksType2 addObject:[error copy]];
}

这是例外:

2013-08-30 14:00:32.211 AppName[3500:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x9960540'

为什么?为什么我不能像第一次一样简单地运行复制的操作。

编辑:

似乎实际的copyForRetry对我不起作用。或者我以错误的方式使用它。

即使我在复制后尝试直接使用复制的对象,它也会崩溃。 这不起作用;我得到了同样的例外:

self.refreshOperation = [operation copyForRetry];

[self.refreshOperation getRoutesCompletionHandler:^(NSArray *routes) {
...
}

任何人都有一个很好的解决方案吗?如何存储最后一个操作以进行刷新?

Edit2:我尝试使用NSObject方法副本,但仍然遇到同样的问题。我想复制方法中缺少一些东西。

但是我不需要使用这种方法来解决问题,我只需要一个平滑的解决方案。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

看起来像MKNetworkOperation.m中的错误(第507行):

https://github.com/MugunthKumar/MKNetworkKit/blob/master/MKNetworkKit/MKNetworkOperation.m

使用“copy”而不是“mutableCopy”复制NSMutableArray属性responseBlock。作者的想法可能是他不能在“复制”方法中调用“mutableCopy”,但这没有多大意义,因为没有MKNetworkOperation类的不可变变体。