AFNetworking 在第一个 运行 时返回 null

AFNetworking returning null on first run

我有一个列表,当用户点击列表中的一项时,他会根据 HTTP 请求的响应重定向到另一个页面。

代码:

-(void) checkCardPresent{

//    NSOperationQueue *networkQueue = [[NSOperationQueue alloc] init];
//    networkQueue.maxConcurrentOperationCount = 5;
    NSURL *url = [NSURL URLWithString:@"https://XXXXXXX/getCardDetails"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
                                         initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
       string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
       if([string isEqualToString:@""]){
            self.isCardPresent = NO;
        }
       else{

           self.isCardPresent = YES;
       }
        NSLog(@"%@", string);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%s: AFHTTPRequestOperation error: %@", __FUNCTION__, error);
    }];
    //[networkQueue addOperation:operation];

问题: 现在,当我首先单击该项目时,我被带到了错误的页面。但是,再次返回页面并再次单击时,我被带到了正确的页面。

更多数据: 此代码检查用户是否添加了付款方式。在收到返回的空白文本后,他被带到页面 A。

在收到带有卡数据的正确响应后,他被带到页面 B。

调查:

上面的代码示例在第一次点击时不会导致任何操作,只会终止(无 HTTP 请求)。但是,第二次单击它 returns 卡片详细信息。即执行 HTTP 请求。

有人知道这是怎么回事吗?

我认为发生的情况是您的导航条件是 运行 同步的,但正在检查的条件取决于异步设置的状态。这是猜测,但这是一个常见错误,与您看到的错误的首次行为一致。

您的导航代码目前可能看起来像这样...

// on selection of an item
[self checkCardPresent];
if (self.isCardPresent) {
    // push to some vc
} else {
    // push to some other vc
}

但是,一旦网络工作完成,isCardPresent 条件运行后设置良好。

要解决这个问题,请在您的网络调用中添加一个完成块,然后使用该块进行导航。像这样...

// invoke completion with YES on success, no otherwise
- (void)checkCardPresentWithCompletion:(void (^)(BOOL))completion {
    NSURL *url = [NSURL URLWithString:@"https://XXXXXXX/getCardDetails"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
                                         initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        if([string isEqualToString:@""]){
            self.isCardPresent = NO;
        } else {
            self.isCardPresent = YES;
        }
        NSLog(@"%@", string);
        if (completion) completion(YES);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%s: AFHTTPRequestOperation error: %@", __FUNCTION__, error);
        if (completion) completion(NO);
    }];
}

现在,在网络请求完成后进行导航...

// on selection of an item
// show some UI to indicate that we're busy
[self checkCardPresentWithCompletion:^(BOOL success) {
    // remove the UI that indicates we're busy
    if (success) {
        if (self.isCardPresent) {
            // push to some vc
        } else {
            // push to some other vc
        }
    } else {
        // show UI to indicate an error
    }
}];