0

私の iOS アプリケーションでは、Utility クラスで Twitter からツイートをフェッチしてから、メイン クラスの UITableView を更新しています (個々のツイートを表示するセルを使用)。以下は私のコードです:

NSMutableArray *tweetsArray = [[NSMutableArray alloc]init];



+ (NSMutableArray *)getTweetStatus:(NSString *)myData{
ACAccountStore *store = [[ACAccountStore alloc] init];
ACAccountType *twitterAccountType = 
[store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
dispatch_queue_t myCustomQueue;
myCustomQueue = dispatch_queue_create("com.example.MyCustomQueue", NULL);
[store requestAccessToAccountsWithType:twitterAccountType 
                 withCompletionHandler:^(BOOL granted, NSError *error) {
                      dispatch_sync(myCustomQueue, ^{
                     if (!granted) {
                         // The user rejected your request 
                         NSLog(@"User rejected access to the account.");
                     } 
                     else {
                         // Grab the available accounts
                         NSArray *twitterAccounts = 
                         [store accountsWithAccountType:twitterAccountType];

                         if ([twitterAccounts count] > 0) {
                             // Use the first account for simplicity 
                             ACAccount *account = [twitterAccounts objectAtIndex:0];

                             // Now make an authenticated request to our endpoint
                             NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
                             [params setObject:@"1" forKey:@"include_entities"];

                             //  The endpoint that we wish to call
                             NSURL *url =  [NSURL URLWithString:@"http://api.twitter.com/1/statuses/home_timeline.json"];

                             //  Build the request with our parameter 
                             TWRequest *request = 
                             [[TWRequest alloc] initWithURL:url 
                                                 parameters:params 
                                              requestMethod:TWRequestMethodGET];

                             // Attach the account object to this request
                             [request setAccount:account];

                             [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                                 dispatch_sync(myCustomQueue, ^{
                                 if (!responseData) {
                                      // inspect the contents of error 
                                      NSLog(@"%@", error);
                                  } 
                                  else {
                                      NSError *jsonError;
                                      NSMutableArray *tweets =[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&jsonError];            
                                      if (tweets) {                          
                                          // at this point, we have an object that we can parse
                                          NSLog(@"%@", tweets);
                                      }
                                      else { 
                                          // inspect the contents of jsonError
                                          NSLog(@"%@", jsonError);
                                      }
                                      [tweetsArray addObjectsFromArray:tweets];

                                  }
                                 });
                              }];

                         }
                     }
    });
    }];
     return tweetsArray; 
    }

問題は、応答を取得するまで (つまり、ツイート応答を「tweetsArray」に追加する TWRequest performRequestWithHandler メソッドから応答を取得する) 「tweetsArray を返し」たくないことです。このために、「dispatch_sync」を 2 つの場所に配置しました。

  1. requestAccessToAccountsWithType:twitterAccountType
  2. [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)

しかし、私はこれでそうすることができません。

4

1 に答える 1

0

たぶん、あなたはあなたのコードをこのようなものに変えるべきです:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // put you twitter request here

    dispatch_async(dispatch_get_main_queue(), ^{

        [self changeMyInterfaceMethod: tweetsArray];

    });
});
于 2012-10-15T06:43:13.257 に答える