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