【问题标题】:Update textfield in uitableviewcell after slrequest performrequestwithhandler stall with twitter handle在 slrequest performrequestwithhandler 使用 twitter 句柄停止后更新 uitableviewcell 中的文本字段
【发布时间】:2014-03-28 08:02:24
【问题描述】:

我正在尝试提取用户的 twitter 句柄并将其填充到 tableview 中的文本字段中。请求成功完成并调用执行块,但 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");
}

【问题讨论】:

    标签: ios objective-c uitableview twitter slrequest


    【解决方案1】:

    它真的会立即调用“twitterDictionaryHandler”函数吗?

    如果它这样做了,但有一段时间没有更新 UI,那么这似乎是 iOS 的一个常见问题。您需要做的是将 UI 的更改放入 GCD(Grand Central Dispatch)主队列,以便它具有优先级并尽快完成。我在下面为可能遇到此问题的其他人提供了一个示例。

    dispatch_async(dispatch_get_main_queue(), ^{
        username.textField.text = dictionary[@"screen_name"]; 
    }); 
    

    【讨论】:

    • 它实际上是立即调用 twitterDictionaryHandler 函数。由于我保存了用户信息,因此我尝试重新加载 tableview 并检查用户信息。我记录了块结束和表重新加载,发现从块结束到表重新加载有 11 秒的延迟。
    • 感谢使用 GCD 运行它的建议,我将 twitterDictionaryHandler 放入主队列并在一秒钟内更新。
    猜你喜欢
    • 2013-06-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多