AFNetworking在首次运行时返回null

时间:2016-10-27 18:26:05

标签: ios objective-c http afnetworking

我有一个列表,当用户点击列表中的某个项目时,他会根据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];

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

更多数据: 此代码检查用户是否具有添加的付款方式。收到空白文本后,他将被带到PAGE A。

在收到卡片数据的正确回复后,他将被带到B页。

调查:

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

有谁知道发生了什么事?

1 个答案:

答案 0 :(得分:1)

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

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

// 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
    }
}];