0

ユーザーの Twitter ハンドルを取得して、テーブルビューのテキスト フィールドに入力しようとしています。リクエストは正常に完了し、実行ブロックを呼び出しますが、UI の更新には数秒かかります。NSNotifications を使用して UI の変更をトリガーしようとしましたが、それでも UI の更新に遅延がありました。以下は、ACAccountStore から情報を取得するために使用するコードです。テーブルに使用している唯一の特別なクラスは、カスタム UITableViewCell 用です。他の誰かがこれを見ていますか?または、ランタイムの問題を引き起こしている何かが欠けていますか?

- (IBAction)connectTwitter:(id)sender {
      UISwitch *sw = (UISwitch *)sender;
      if (sw.isOn == NO) {
           return;
      }    
     ACAccountStore *account = [[ACAccountStore alloc] init];
     ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    __weak MBSuitUpViewController *weakSelf = self;
    [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
        if (granted == YES) {
            NSArray *arrayOfAccounts = [account accountsWithAccountType:accountType];
            if (arrayOfAccounts.count > 0) {
                ACAccount *twitterAccount = [arrayOfAccounts lastObject];
                NSURL *requestURL = [NSURL URLWithString:@"https://api.twitter.com/1/account/verify_credentials.json"];
                SLRequest *user = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:requestURL parameters:nil];
                user.account = twitterAccount;
                [user performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];
                    [weakSelf twitterDictionaryHandler:json];
                    weakSelf.userInfo = @{@"name": json[@"name"], @"handle":json[@"screen_name"]};
            }];
            } else {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"No Twitter Account Found" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Okay", nil];
                [alert show];
            }
        } else {
            NSLog(@"Permission denied %@", error.localizedDescription);
        }
    }];
}

- (void)twitterDictionaryHandler:(NSDictionary *)dictionary {
    MBSuitUpCell *username = (MBSuitUpCell *)[self.view viewWithTag:2];
    username.textField.text = dictionary[@"screen_name"];
    NSLog(@"Should update textfield");
}
4

1 に答える 1

1

実際に「twitterDictionaryHandler」関数をすぐに呼び出しますか?

それができても、UI がしばらく更新されない場合は、iOS の一般的な問題のようです。UI の変更を GCD (Grand Central Dispatch) メイン キューに入れ、優先してできるだけ早く完了するようにする必要があります。この問題を抱えている可能性のある他の人のために、以下に例を示しました。

dispatch_async(dispatch_get_main_queue(), ^{
    username.textField.text = dictionary[@"screen_name"]; 
}); 
于 2014-02-25T20:39:44.603 に答える