0

我似乎无法让代理回调工作,当我线程我的代码。我正在尝试使用NSURLConnection调用远程服务器以获取access_token。 access_token在连接中被接收:didReceiveResponse:delegate。这是不是一个问题,直到我线程。我认为我正在为我的代表传递正确的对象,但它没有达到连接:didReceiveResponse:获取NSURLConnection委托回调到正确的线程

任何人都可以看到为什么连接:didReceiveResponse:在LoginViewController不会调用时,我线程调用?谢谢。

LoginViewController.m

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSString *access_token = [self getTokenFromResponse: response]; 
    [self.delegate didGetAccessToken:access_token]; 
} 

- (void)fetchAccessTokenNoUI 
{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: @"www.mysite.com"]]; 
    [NSURLConnection connectionWithRequest:request delegate:self]; 
} 

AccessToken.h

@interface AccessToken : NSObject 
@property (atomic, strong) LoginViewController *loginViewController; // doing this to try to keep it persistent 
- (void) fetchAccessTokenWithDelegate: (id <LoginDelegate>)delegate; 
@end 

AccessToken.m

- (void) fetchAccessTokenWithDelegate: (id <LoginDelegate>)delegate 
{ 
    dispatch_queue_t downloadQueue = dispatch_queue_create("Fetch access_token queue", NULL); 
    dispatch_async(downloadQueue,^{ 
     // this works fine if I don't do it in a queue 
     self.loginViewController = [[LoginViewController alloc] init]; 
     self.loginViewController.delegate = delegate; 
     [self.loginViewController fetchAccessTokenNoUI]; 

    }); 
    dispatch_release(downloadQueue); 
} 

CallingClass.m

- (void)didGetAccessToken:(NSString *)access_token 
{ 
    if (!access_token) 
    { 
     LoginViewController *userProfileViewController = [[LoginViewController alloc] init]; 
     userProfileViewController.delegate = self; 
     [self.navigationController pushViewController:userProfileViewController animated:YES]; 
    } 
} 
- (IBAction)favourite:(id)sender 
{ 
    AccessToken *accessToken = [[AccessToken alloc] init]; 
    [accessToken fetchAccessTokenWithDelegate:self]; 

} 
+0

看看http://stackoverflow.com/a/8919203/214350 –

+0

可能重复的[GCD和异步NSURLConnection](http://stackoverflow.com/questions/8918501/gcd-and-async-nsurlconnection ) –

回答

0

因此,经过一些更多的研究,我找到了解决方案。

我实际上并不需要AccessToken.h/m。我认为NSURLConnection调用会阻止我的UI线程。但NSURLConnection connectionWithRequest:delegate:会自动在单独的线程中运行。

所以我所要做的就是删除AccessToken.h和AccessToken.m。然后,在CallingClass.m中,我改变favourte:到

- (IBAction)favourite:(id)sender 
{ 
    LoginViewController *loginViewController = [[LoginViewController alloc] init]; 
    [loginViewController fetchAccessTokenWithDelegate:self]; 

} 

就是这样!根本不需要dispatch_queue_t。

0

你有没有把存根实现所需的协议的方法,

-(void)connectionDidFinishLoading:(NSURLConnection *)connection; 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 

因为我有哪去实现他们离开后,类似的问题。

+0

刚刚尝试过,但没有运气。我甚至在.h中公开它们,但仍然没有工作。 – Raymond

+0

'didReceiveResponse'这个函数根本不被调用? – vellvisher

+0

号didReceiveResponse没有被调用。它会被连接调用:didReceiveResponse:甚至没有被调用。受你评论的启发,我试着从[LoginViewController fetchAccessTokenNoUI]调用didReceiveResponse,它的工作原理让我相信这意味着代理已正确设置。 – Raymond

相关问题