【发布时间】:2013-12-22 09:24:59
【问题描述】:
我正在通过 Google Places API 在搜索栏上集成自动完成功能。对于网络请求,我使用 AFNetworking。
我希望一次只运行一个请求。所以每次我输入一个新字母时,我都会执行以下操作:
1 - 取消之前的 AFHTTPRequestOperation:
[self.currentGlobalSearchListRequest cancel];
NSLog(@"%@ cancelled", self.currentGlobalSearchListRequest);
2 - 启动一个新的 AFHTTPRequestOperation:
self.currentGlobalSearchListRequest = [searchService getGlobalSearchListItemsForString:searchString inRegion:region delegate:self];
NSLog(@"%@ started", self.currentGlobalSearchListRequest);
这是请求完成运行时调用的回调:
- (void)request:(PointSearchRequest *)request didLoadSearchListItems:(NSArray *)searchListItems {
NSAssert(request == self.currentGlobalSearchListRequest, @"!!!callback from a request that should be cancelled!!!");
[self.delegate searchListLoader:self didLoadGlobalSearchList:searchListItems];
}
有时我遇到了断言,所以我调查了一下,发现大多数时候
使用错误代码 NSURLErrorCancelled 调用失败块,这是预期的行为,但有时会调用成功块!
此堆栈跟踪告诉我代码中的事情以正确的顺序发生
2013-12-22 09:38:46.484 Point[63595:a0b] <PointSearchRequest: 0x18202b50> started
2013-12-22 09:38:46.486 Point[63595:a0b] <PointSearchRequest: 0x18202b50> cancelled
2013-12-22 09:38:46.487 Point[63595:a0b] <PointSearchRequest: 0x181a5dd0> started
2013-12-22 09:38:46.496 Point[63595:a0b] *** Assertion failure in -[SearchListLoader request:didLoadSearchListItems:], /Users/aurelienporte/Documents/Developpement/Perso/iOS/Point/Point/Classes/Models/SearchListLoader.m:82
(lldb) po request
<PointSearchRequest: 0x18202b50>
另外,当调用成功块时,我查看了 AFHTTPRequestOperation 上的属性 isCancelled,但它给了我 NO (!!!)
我知道我最终可能只是测试而不是使用 NSAssert,但我想找出问题的根源。
你有没有遇到过类似的问题,cancel 并没有真正取消请求?然后调用成功块而不是失败块?这是要向 AFNetworking 团队报告的问题吗?谢谢!
如果它可以提供帮助,请求会非常快(Google 自动完成 API 令人印象深刻......)
【问题讨论】:
-
我期待这个。取消尚未触发其完成处理程序的已完成操作是不明确的;它可以触发完成处理程序或接受取消。我不会指望任何一个发生 100% 的时间。
标签: ios afnetworking afhttprequestoperation