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

相關問題