Ios 从Facebook数据填充我的模型(<;FBGraphUser>;)
我创建了一个名为User的模型,它有一个属性“name” 我正在向facebook API发出请求(使用最新的iOS SDK),想法是在facebook返回数据时设置我的user.name属性 facebook将数据返回到Ios 从Facebook数据填充我的模型(<;FBGraphUser>;),ios,facebook,sdk,facebook-ios-sdk,Ios,Facebook,Sdk,Facebook Ios Sdk,我创建了一个名为User的模型,它有一个属性“name” 我正在向facebook API发出请求(使用最新的iOS SDK),想法是在facebook返回数据时设置我的user.name属性 facebook将数据返回到startWithCompletionHandler块,但我无法将此数据设置为我的用户对象,我只能在startWithCompletionHandler上访问数据。当我尝试访问块外的数据时,我的模型返回NULL 当facebook请求返回时,我如何填充我的模型/对象 我当前的方
startWithCompletionHandler
块,但我无法将此数据设置为我的用户对象,我只能在startWithCompletionHandler
上访问数据。当我尝试访问块外的数据时,我的模型返回NULL
当facebook请求返回时,我如何填充我的模型/对象
我当前的方法实现:
+ (void)requestUserData:(User *)userModel {
if(FBSession.activeSession.isOpen) {
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if(user.name) [self setUserData:user userModel:userModel];
}];
}
}
+ (void)setUserData:(NSDictionary<FBGraphUser> *)user userModel:(User *)userModel {
userModel.name = user.name;
}
谢谢。Facebook的SDK正在异步获取,因此您编写的完成处理程序将在您的助手方法返回后执行 因此,当您的方法返回您的User对象时,它在逻辑上只是一个空用户(因为您已经分配/初始化了它) 当调用完成块时,该用户对象将被更新,但此时,您不再在应用程序(视图控制器)中处理它 因此,我的建议是:从视图控制器更直接地使用Facebook SDK,或者如果您希望将所有这些逻辑保留在helper类中,则将其更改为使您的方法不返回数据,但它需要一个块,当数据请求完成时将调用该块,类似如下:
+ (void)requestUserDataWithCompletionHandler:(void (^)(User *user, NSError *error))handler{
if(FBSession.activeSession.isOpen) {
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if(!error){
User *userData = [[User alloc] init];
userData.name = user.name;
dispatch_async(dispatch_get_main_queue(), ^{
handler(userData, nil);
});
}
else{
dispatch_async(dispatch_get_main_queue(), ^{
handler(nil, error);
});
}
}];
}
}
- (void)updateStatusLabels {
if([GFFacebookHelpers isLogged]){
[GFFacebookHelpers requestUserDataWithCompletionHandler:^(User *user, NSError *error) {
if(!error){
self.fbStatus.text = user.name;
[_loginButton setTitle:@"Logout" forState:UIControlStateNormal];
}
}];
}else{
self.fbStatus.text = @"You need to login";
[_loginButton setTitle:@"Login" forState:UIControlStateNormal];
}
}
你是想把
FBGraphUser
数据映射到你的模型上,还是你的模型上有一个name
属性?目前在测试中,我只有“name”属性,但这个问题解决后,我会扩展我的模型来存储facebook用户基本数据Daniel,我在代码片段示例中犯了一个错误。我这样设置userModel.name:userModel.name=user.name
不带循环。我在五月邮报上把这封信修好了。我已经实现了您的建议代码,但是当我调用\uuu block User*User=[[User alloc]init]时,我仍然收到NULL代码>[GFFacebookHelpers requestUserData:user]代码>NSLog(@“user:%@”,user.name)代码>如果你有一个我可以下载的演示项目,我很乐意仔细看看。丹尼尔,我把演示放在我现在工作的地方:git://github.com/godfather/facebookclasstest.git 随时改变你想要的。注:我在这里发布的最新示例之后做了一些更改,感谢我为您的回购进行了分叉,并更改了一些内容,创建了一个pull请求供您查看。基本上,您的请求完成块是在方法返回后触发的,当然,这是因为Facebook SDK是异步获取数据的。因此,我在方法中添加了一个回调块。现在感觉就像一个包裹包裹在包裹上。。。但至少您可以处理helper类中的数据错误,并让视图控制器负责根据成功/失败显示/隐藏应用程序的部分。请看一下你的回购协议。我也会在这里更新我的答案。
- (void)updateStatusLabels {
if([GFFacebookHelpers isLogged]){
[GFFacebookHelpers requestUserDataWithCompletionHandler:^(User *user, NSError *error) {
if(!error){
self.fbStatus.text = user.name;
[_loginButton setTitle:@"Logout" forState:UIControlStateNormal];
}
}];
}else{
self.fbStatus.text = @"You need to login";
[_loginButton setTitle:@"Login" forState:UIControlStateNormal];
}
}