2016-10-27 9 views
0

私はリストを持っています。ユーザーがリストのアイテムの1つをクリックすると、HTTPリクエストの応答に基づいて別のページにリダイレクトされます。AFnetworkingは最初の実行時にnullを返します

コード:

-(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]; 

問題:私は最初の項目をクリックすると は、今、私が間違ったページに取られています。しかし、もう一度ページに戻って再びクリックすると、正しいページに移動します。

その他のデータ: このコードでは、ユーザーに支払方法が追加されているかどうかを確認します。最初のクリックで上記のコードサンプルがありません

:空白のテキストを受信すると、バック彼は彼がページB.

調査に取られるカードデータとの適切な応答を受信したページをA.

に取られます何らかの操作を引き起こし、単に終了します(HTTP要求なし)。ただし、2回目にクリックすると、カードの詳細が返されます。即ち、HTTPリクエストを実行する。

何が起こっているのか分かりませんか?

答えて

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

さて、ネットワーク要求が完了した後、あなたのNAVを行う​​...

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

それは完成がC99には無効であると言います。 – Ackman

+0

何行ですか?あなたは宣言と使用法で同じブロックパラメータを綴っていますか? – danh

+0

ありがとうございます。できます!!!私は客観的にかなり新しいです。ヘルプを感謝:) – Ackman

関連する問題