gpt4 book ai didi

ios - 从 Facebook 数据填充我的模型 ()

转载 作者:行者123 更新时间:2023-11-29 10:58:52 26 4
gpt4 key购买 nike

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

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

facebook 将数据返回到 startWithCompletionHandler block 中,但我无法将此数据设置到我的用户对象,我只能访问 startWithCompletionHandler 上的数据。当我尝试访问 block 外的数据时,我的模型返回 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;
}

调用:

   __block User *user = [[User alloc] init];
[GFFacebookHelpers requestUserData:user];
NSLog(@"user: %@", user.name); //this part prints 2013-06-06 18:03:43.731 FacebookClassTest[74172:c07] user: (null)

谢谢。

最佳答案

Facebook 的 SDK 是异步获取的,因此您编写的完成处理程序会在您的辅助方法返回后执行。

因此,当您的方法返回您的用户对象时,逻辑上它只是一个空用户(因为您已经分配/初始化了它)。

当完成 block 被调用时,该用户对象被更新,但此时,您不再在您的应用程序( View Controller )中处理它。

所以这是我的建议:要么更直接地从您的 View Controller 使用 Facebook SDK,要么如果您想将所有这些逻辑保留在您的帮助程序类中,然后更改它以便您的方法不返回数据,但它需要数据请求完成时将调用的 block ,更像这样:

+ (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);
});
}
}];
}
}

请注意,我已将处理程序 block 的调用包装在 dispatch_async() 到主队列中,以确保您可以继续更新任何 UI。

你的 View Controller 的方法现在看起来像这样:

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

关于ios - 从 Facebook 数据填充我的模型 (<FBGraphUser>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16971515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com