0

这可能与我对块的理解有关,也可能与 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....");
    }

}

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

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

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

谢谢!

4

1 回答 1

1

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

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

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

于 2012-04-19T19:16:04.973 回答