0

我有一个 UITextField,它允许用户为 Facebook 照片输入自定义专辑名称。一旦 textFieldShouldReturn,我将 textField.text 发送到 Facebook。一旦调用完成处理程序,我想更新我的模型并重新加载我的 tableView 中的数据。

我的问题是我的完成处理程序的某些行从未被调用。我用调试器标记了所有行,一旦我逐行执行代码,其中一些行永远不会被调用,尤其是 tableView reload 方法。

我在线程方面做错了吗?为什么我的部分完成处理程序被取消并且从未被调用?

这是我的代码:

-(BOOL)textFieldShouldReturn:(UITextField *)textField {

NSString *newAlbumName;
newAlbumName = textField.text;

NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
[parameters setObject:newAlbumName forKey:@"name"];
[parameters setObject:newAlbumName forKey:@"message"];

FBRequest* request = [FBRequest requestWithGraphPath:@"me/albums" parameters:parameters HTTPMethod:@"POST"];

FBRequestConnection *connection = [[FBRequestConnection alloc] init];
[connection addRequest:request
     completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
         if (!error) {
             NSDictionary *newAlbum;
             [newAlbum setValue:newAlbumName forKey:@"name"];
             [self.albums addObject:newAlbum];
             NSLog(@"created: %@", [newAlbum objectForKey:@"name"]);
             [self.tableView reloadData];
         }
         else {
             NSLog(@"Error: %@", error.userInfo);
         }


     }];
[connection start];

[textField resignFirstResponder];
[textField removeFromSuperview];



   return YES;

}
4

2 回答 2

1

我相信这是线程问题。我从未使用过FBRequestConnection类,但如果它的块在后台线程上执行,则需要在主线程上更新 UI,如下所示:

if (!error) {
    NSDictionary *newAlbum;
    [newAlbum setValue:newAlbumName forKey:@"name"];
    [self.albums addObject:newAlbum];
    NSLog(@"created: %@", [newAlbum objectForKey:@"name"]);
    dispatch_async(dispatch_get_main_queue(),^{
        [self.tableView reloadData];
    });
}
于 2013-11-27T21:16:18.127 回答
1

你不应该直接在你的块中调用 self 。它可能会导致一个保留周期。所以在块声明之前:

__weak typeof(self) weakSelf = self;

weakSelf在你的块中使用而不是自我。

于 2013-11-27T20:09:43.773 回答