我在尝试通过NSURLConnection加载网址之前验证用户的令牌。
我的问题是,如果我在dispatch_async
块中启动NSURLConnection(参见下面的1),则永远不会调用(NSURLConnection *)connection didReceiveData
方法。
1。在新线程上调用令牌检查的方法:
- (void)awaitTokenCheckCompletion:(void (^) (BOOL success))completion {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{
[self checkAccessTokenExpiration];
dispatch_async(dispatch_get_main_queue(), ^{
});
});
}
上面的代码调用checkAccessTokenExpiration
方法,该方法将触发下面的createClientCredentials
方法。
2。创建NSURLConnection的方法:
-(void) createClientCredentials {
DLog("Getting Access Token");
NSString *post = [NSString stringWithFormat:@"type=get&id=%@&key=%@",@"id",@"key"];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@authorization/keys", serverURL]]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
__attribute__((unused))
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
}
第3。永远不会调用(NSURLConnection *)连接didReceiveData方法:
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data {
DLog("gotData");
}
答案 0 :(得分:2)
您可以从文档
中设置块内的委托连接的委托对象。当负载进行时,连接调用此委托上的方法。委托方法在调用此方法的同一线程上调用。为了使连接正常工作,调用线程的运行循环必须在默认的运行循环模式下运行。
因此,尝试在异步块
之外设置委托答案 1 :(得分:1)
不会使用dispatch_async块调用NSURL连接。 如果通过编写conn start在主线程中调用相同的代码,它将调用NSURLConnection的委托。
初始化并启动NSURL连接: -
NSURLConnection* conn = [[NSURLConnection alloc]
initWithRequest:request delegate:self];
[conn start];
您可以选择3种不同的选项来调用api并获取数据: -
请参阅此链接: -
http://iosdevelopmentjournal.com/blog/2013/01/27/running-network-requests-in-the-background/
希望这个答案对你有所帮助。感谢