3

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

我有这个属性:

 @property (nonatomic, strong) GetRouteOperation* refreshOperation;

其中RouteOperation继承自MKNetworkOperation,它是不同类型RouteOperation的超类,例如“Get routes in radius”、“Get routes by city”等。

我像这样初始化操作:

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 方法复制,但仍然遇到同样的问题。我想我在复制方法中缺少一些东西。

但是我不需要将这种方法用于解决方案,我只需要一个平滑的解决方案。有任何想法吗?

4

1 回答 1

1

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

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

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

于 2013-09-03T07:19:25.113 回答