NSURLConnection的didReceiveData在dispatch_async阻止

时间:2015-05-26 05:43:29

标签: ios objective-c nsurlconnection

我在尝试通过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");
}

2 个答案:

答案 0 :(得分:2)

您可以从文档

中设置块内的委托
  

连接的委托对象。当负载进行时,连接调用此委托上的方法。委托方法在调用此方法的同一线程上调用。为了使连接正常工作,调用线程的运行循环必须在默认的运行循环模式下运行。

因此,尝试在异步块

之外设置委托

答案 1 :(得分:1)

不会使用dispatch_async块调用NSURL连接。 如果通过编写conn start在主线程中调用相同的代码,它将调用NSURLConnection的委托。

初始化并启动NSURL连接: -

 NSURLConnection* conn = [[NSURLConnection alloc]    
                         initWithRequest:request delegate:self];
 [conn start];

您可以选择3种不同的选项来调用api并获取数据: -

  • sendSynchronousRequest
  • sendAsynchronousRequest
  • 初始化NSUrlConnection并告诉它启动

请参阅此链接: -

http://iosdevelopmentjournal.com/blog/2013/01/27/running-network-requests-in-the-background/

希望这个答案对你有所帮助。感谢