在附加到 PFImageView 之前未加载 PFFile 图像?

Posted

技术标签:

【中文标题】在附加到 PFImageView 之前未加载 PFFile 图像?【英文标题】:PFFile image not loaded before attaching to PFImageView? 【发布时间】:2014-10-23 22:55:41 【问题描述】:

我正在使用 Parse 和 Facebook 登录来创建新用户。我从 Facebook 获得了一些字段,例如他们的姓名和位置,请求他们的个人资料图像在后台加载,然后我转到我的主视图控制器,该控制器具有个人资料图像的 PFImageView。

问题在于,当主视图控制器的 viewDidLoad 触发时,PFFile 用户[@"profileImage"] 仍然为零,因此没有什么可以加载InBackground。

我不想在进入主视图控制器之前等待配置文件图像加载......这会花费一些随机时间并且很糟糕。

那么,如何处理在将其提供给 PFFImageView 之前尚未加载的 PFFile?某种占位符?

这是我的代码:

------- in LoginViewController.m

- (void) pressedFacebookLogin 
    [PFFacebookUtils logInWithPermissions...
        if(user.isNew) 
           FBRequest *request = [FBRequest requestForMe];
           [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
                NSDictionary *userData = (NSDictionary *)result;    

                user[@"fullName"] = userData[@"name"];
                // get location, relationship if available
                [user saveInBackground];

                // start getting the user's profile image before going to main view controller
                NSURL *pictureURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large&return_ssl_resources=1", facebookID]];
                NSURLRequest *urlRequest = [NSURLRequest requestWithURL:pictureURL];
                [NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 

                    if (connectionError == nil && data != nil) 
                        UIImage *tmpImage = [UIImage imageWithData:data];
                        NSData *imageData = UIImagePNGRepresentation(tmpImage);
                        PFFile *imageFile = [PFFile fileWithName:@"image.png" data:imageData];
                        user[@"profileImage"] = imageFile;
                        [user saveInBackground];
                    
                ];

                [self segueToMainViewController];

           ];
        else 
             // deal with existing user...
        
    ];


-------------- in MainViewController.m

- (void) viewDidLoad 
    [super viewDidLoad];

    PFUser *user = [PFUser currentUser];

    self.profileImageView.image = [UIImage imageNamed:@"placeholder"];
    PFFile *profileImageFile = user[@"profileImage"];
    // at this point profileImageFile is nil
    self.profileImageView.file = profileImageFile;
    [self.profileImageView loadInBackground];


【问题讨论】:

【参考方案1】:

在你得到 profileImageFile 为空的地方添加这一行。

我猜你使用的 profileImageView 是一个 ImageView。

@property (weak, nonatomic) IBOutlet UIImageView *profileImageView;

// at this line where you get profileImageFile as nil
[self.profileImageView setImageWithURL:[NSURL URLWithString:user[@"profileImage"]] placeholderImage:[UIImage imageNamed:@"default_profileImage"]];

【讨论】:

不,profileImageView 是一个 PFImageView,它是 Parse 的 UIImageView 的一个子类,给定一个 PFFile,它可以在后台加载它的图像文件。这就是重点……因为我是第一次创建用户,并且他们的个人资料图像尚未从 Facebook 下载,所以当我在下一个 viewController 中访问 viewDidLoad 时,user[@"profileImage"] 为 nil。它最终会被填满,但对于 viewDidLoad 来说为时已晚。

以上是关于在附加到 PFImageView 之前未加载 PFFile 图像?的主要内容,如果未能解决你的问题,请参考以下文章

PF QueryCollection ViewController 中首次加载时未出现图像

使用可可豆荚的 Parse 1.7.1 中缺少 PFImageView

PFImageView 问题:无法在表格视图单元格中显示来自 Parse 的图像

如何在 Swift 中使用 PFImageView?

解析错误:Interface Builder 文件中的未知类 PFImageView

UITableViewCell 上的 PFImageView 断断续续的滚动