这可能与我对块的理解有关,可能与NSOperationQueue如何/何时触发它的操作有关,但无论如何我都会问:
我有一个基本的提取请求方法:
- (void)fetchActiveUser:(NSString*)username withPassword:(NSString *)password {
[self setAuthorizationHeaderWithUsername:username password:password];
// SETS FLAG that we are performing a request
fetchModeActive = TRUE;
[self getPath:kTLActiveUserURI parameters:nil success:^(AFHTTPRequestOperation
*operation, id responseObject) {
if ([responseObject isKindOfClass:[NSXMLParser class]]) {
TLPersonParser *personParser = [[TLPersonParser alloc]
initWithParser:responseObject];
[personParser setDelegate: self];
[personParser parsePeople];
[personParser release];
}
// handle stuff here.
NSLog(@"Success!");
fetchModeActive = FALSE;
[[NSNotificationCenter defaultCenter]
postNotificationName:kTLFetchedActiveUserNotification object:nil];
}
failure:^(__unused AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure.");
fetchModeActive = FALSE;
[[NSNotificationCenter defaultCenter]
postNotificationName:kTLFetchedActiveUserNotification object:error];
}];
while(self.fetchModeActive) {
// WHY DOES THIS RUN INFINITELY?
// Both above Success: & Failure: blocks set fetchModeActive = FALSE
// when complete
NSLog(@"fetching....");
}
}
滚动到最底部,您将看到我等待的循环。为什么这会无限输出“抓取......”? 成功:和失败:块都将我们的fetchModeActive标志设置为false?
我的理解是这个获取操作在后台异步运行,但看起来甚至没有执行获取!
有什么建议吗?我是否需要在单独的线程中触发获取请求?
谢谢!
答案 0 :(得分:1)
要回答你的问题,为什么这不会终止的原因是你需要在__block
之前有一个fetchModeActive
指令,以便块能够更改范围之外的变量。块。 (您还希望使用YES
和NO
作为布尔文字,因为它们是Objective-C中的约定
但要解决更重要的问题,你不应该这样做。相反,创建一个操作,并-start
- 或者更好 - 将其添加到NSOperationQueue
。一切都将在后台异步执行,并在完成后触发回调。
异步编程可能很难理解。如果需要定义依赖于此方法完成的行为,则可能需要向方法添加块参数,并在成功和失败回调中执行该参数。