0

コードをスレッド化するときに、Delegate コールバックが機能しないようです。NSURLConnection を使用してリモート サーバーを呼び出し、access_token を取得しようとしています。access_token は connection:didReceiveResponse: delegate で受信されます。スレッド化するまで、これは問題ではありません。デリゲートに正しいオブジェクトを渡していると思っていましたが、接続に到達しません:didReceiveResponse:

connection:didReceiveResponse: in 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];

}
4

2 に答える 2

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;

私はそれらを実装した後に消えた同様の問題を抱えていたからです。

于 2012-06-19T18:05:26.320 に答える
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 はまったく必要ありません。

于 2012-06-20T18:55:09.833 に答える