AFNetworking - 为什么异步XML操作不会触发并且循环无限运行?

时间:2012-04-19 17:07:53

标签: objective-c cocoa objective-c-blocks nsoperationqueue afnetworking

这可能与我对块的理解有关,可能与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?

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

要回答你的问题,为什么这不会终止的原因是你需要在__block之前有一个fetchModeActive指令,以便块能够更改范围之外的变量。块。 (您还希望使用YESNO作为布尔文字,因为它们是Objective-C中的约定

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

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