我有一个列表,当用户点击列表中的某个项目时,他会根据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请求。
有谁知道发生了什么事?
答案 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
}
}];