我有一个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;
}
答案 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];
});
}