有没有一种方法可以停止所有RestKit处理?

4

我在RestKit的错误回调中切换控制器时遇到了问题。这会导致一个错误:

*** -[RKObjectLoader onDidFailWithError]: message sent to deallocated instance 0x1ddd9680

我正在使用以下代码切换方法- (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error

[[[[RKObjectManager sharedManager] client] requestQueue] cancelAllRequests];

scAppDelegate *appDelegate = (scAppDelegate *)[UIApplication sharedApplication].delegate;
WelcomeController *controller = [[WelcomeController alloc] init];
[controller createWelcome];
appDelegate.window.rootViewController = controller;
[appDelegate.window addSubview:[controller view]];
[appDelegate.window makeKeyAndVisible];

我的问题在第一行,因为它没有取消所有RestKit处理。在日志中,我看到一些ObjectMapping操作,并且它们引起了EXC_BAD_ACCESS (SIGSEGV)错误。我找到了一个解决方法-延迟后切换控制器(使用performSelector:withObject:afterDelay)。但是我正在寻找更好的解决方案。

ObjectMapping操作包括:

2012-09-26 14:50:09.408 dr[5004:907] W restkit.object_mapping:RKObjectMapper.m:87 Adding mapping error: Could not find an object mapping for keyPath: ''
2012-09-26 14:50:09.410 dr[5004:907] E restkit.network:RKObjectLoader.m:231 Encountered errors during mapping: Could not find an object mapping for keyPath: ''
2012-09-26 14:50:09.411 dr[5004:907] E restkit.network:RKObjectLoader.m:360 Encountered an error while attempting to map server side errors from payload: Could not find an object mapping for keyPath: ''
2012-09-26 14:50:09.419 dr[5004:907] I restkit.support:RKCache.m:189 Invalidating cache at path: /var/mobile/Applications/1B9919DC-0674-494D-9C26-F1FC1925E856/Library/Caches/RKClientRequestCache-dr.cloudapp.net/SessionStore
2012-09-26 14:50:09.422 dr[5004:907] I restkit.network.reachability:RKReachabilityObserver.m:123 Reachability observer initialized with IP address: 0.0.0.0.

我正在使用最新版本的RestKit。


我仍然有同样的问题,如果您已经找到解决方案,请告诉我。这个崩溃非常突然,可能随时发生。 - Sandeep
解决方案是在切换到另一个控制器之前手动取消队列中的每个挂起请求。但我还没有尝试实现它。如果这个解决方案可行,我会发布代码。 - kraag22
2个回答

1

从RestKit 0.20.0开始:

[[[RKObjectManager sharedManager] operationQueue] cancelAllOperations];

0

你问客户取消所有操作的原因是什么?通常你会要求RKObjectManager来完成这项工作。

[[[[RKObjectManager sharedManager] requestQueue] cancelAllRequests];

如果你这样做并且有待处理的请求,那么你的应用程序将会崩溃。这是我的经验... - kraag22
因为我想在正在处理API请求的函数中调用cancelAllRequests,所以它会删除有关当前请求的信息-> 异常发生。 - kraag22
奇怪。在我的应用程序中使用此方法取消与服务器的同步过程,效果完美。 - flashfabrixx
我只在很少的情况下看到这种行为。当我尝试调试它时,我不得不每隔 X 个请求调用一次,并且一直在控制器之间切换... - kraag22
昨天我发布了我的应用程序的下一个版本,奇怪的是现在我可以确认这种行为。并不是每次都会发生,但有时我也会遇到关于已释放对象的错误。 - flashfabrixx
1
使用这个的原因可能是:“他们给你一个项目,你不知道为什么在 viewDidLoad 中调用了很多次请求... 由于你没有时间重构所有东西,所以你取消了除了最后一次之外的所有调用。” - youssman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接