Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从Facebook数据填充我的模型(<;FBGraphUser>;)_Ios_Facebook_Sdk_Facebook Ios Sdk - Fatal编程技术网

Ios 从Facebook数据填充我的模型(<;FBGraphUser>;)

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请求返回时,我如何填充我的模型/对象 我当前的方

我创建了一个名为User的模型,它有一个属性“name”

我正在向facebook API发出请求(使用最新的iOS SDK),想法是在facebook返回数据时设置我的user.name属性

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];
    }
}