1

iPhoneアプリを書いています。このアプリでは、Twitter フレームワークを使用しています。このフレームワークでは、非同期化で作成されたコールバック関数は別のスレッドにあります。

私のView Controllerでは、

ViewController.m

 [accountStore requestAccessToAccountsWithType:accountType
                        withCompletionHandler:^(BOOL granted, NSError *error) {
                            if (granted) {
                                if (account == nil) {
                                    NSArray *accountArray = [accountStore accountsWithAccountType:accountType];
                                    account = [accountArray objectAtIndex:2];
                                }

                                if (account != nil){
                                    NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/user_timeline.json"];
                                    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
                                    [params setObject:@"1" forKey:@"count"];

                                    TWRequest *request = [[TWRequest alloc] initWithURL:url
                                         parameters:params 
                                      requestMethod:TWRequestMethodGET];
                                    [request setAccount:account];
                                    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                                        if (responseData) {
                                            //Throw response data to other Web API
                                            [self otherAPI:responseData];
                                            [[NSRunLoop currentRunLoop] run];
                                        }
                                    }];

                                }
                            }


                        }];

そして、これらのメソッドをこのクラスに記述します。

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

しかし、他の API から完全なデータを受け取ることができません。最初のデータしか受信できません。マルチスレッドを行うにはいくつかの問題があると思います。したがって、このコードの何が問題なのかを教えてください。

4

1 に答える 1

0

私はあなたの問題を見ていると思います。-connection:didReceiveData:が複数回呼び出される場合は、メッセージ全体を含むNSMutableDataオブジェクトを作成する必要があります。

注:これは、インスタンスごとに一度に1回のダウンロードでのみ機能します。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    self.responseData = [[NSMutableData dataWithCapacity:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.responseData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // self.responseData has all the data.
}
于 2012-07-03T04:56:53.543 に答える