textFieldShouldReturn - 从不调用completionHandler中的某些方法

时间:2013-11-27 19:50:45

标签: ios objective-c facebook uitextfield completionhandler

我有一个UITextField,可让用户输入Facebook照片的自定义相册名称。一旦textFieldShouldReturn,我采取textField.text并将其发送到Facebook。一旦调用完成处理程序,我想更新我的模型并重新加载tableView中的数据。

我的问题是我的completionHandler的某些行从未被调用过。我用调试器标记了所有行,一旦逐行遍历代码,就永远不会调用其中一些行,尤其是tableView重载方法。

我做错了吗?为什么我的completionHandler部分被取消而且从未被调用过?

这是我的代码:

-(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;

}

2 个答案:

答案 0 :(得分:1)

你不应该直接在你的区块中打电话给自己。它可能会导致保留周期。 所以在块声明之前:

  

__弱类型(自我)weakSelf = self;

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

答案 1 :(得分: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];
    });
}