gpt4 book ai didi

objective-c - AFNetworking - 为什么异步 XML 操作没有触发并且循环无限运行?

转载 作者:行者123 更新时间:2023-12-03 17:58:17 25 4
gpt4 key购买 nike

这可能与我对 block 的理解以及 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....");
}

}

滚动到最底部,您将看到我的等待 while 循环。为什么这个运行会无限地输出“正在获取...”success:failure: block 都将我们的 fetchModeActive 标志设置回 false?

我的理解是,此获取操作在后台异步运行,但看起来甚至没有执行获取!

有什么建议吗?我需要在单独的线程中触发提取请求吗?

谢谢!

最佳答案

为了回答您的问题,这不会终止的原因是您需要在 fetchModeActive 之前使用 __block 指令,以便 block 能够更改变量在 block 的范围之外。 (您还需要使用 YESNO 作为 bool 文字,因为它们是 Objective-C 中的约定)

但是为了解决更大的问题,你不应该这样做。相反,创建一个操作,然后-start它——或者更好——将其添加到NSOperationQueue。一切都将在后台异步执行,并在完成时触发回调。

异步编程可能很难让您理解。如果您需要定义依赖于此方法完成的行为,您可能需要向该方法添加一个 block 参数,并在成功和失败回调中执行该参数。

关于objective-c - AFNetworking - 为什么异步 XML 操作没有触发并且循环无限运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10233173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com