我正在尝试实现刷新功能。我有多种类型的操作填充我的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方法副本,但仍然遇到同样的问题。我想复制方法中缺少一些东西。
但是我不需要使用这种方法来解决问题,我只需要一个平滑的解决方案。有什么想法吗?
答案 0 :(得分:1)
看起来像MKNetworkOperation.m中的错误(第507行):
https://github.com/MugunthKumar/MKNetworkKit/blob/master/MKNetworkKit/MKNetworkOperation.m
使用“copy”而不是“mutableCopy”复制NSMutableArray属性responseBlock。作者的想法可能是他不能在“复制”方法中调用“mutableCopy”,但这没有多大意义,因为没有MKNetworkOperation类的不可变变体。