使用 Parse 从预定义的 User 类中查询 PFFile

Posted

技术标签:

【中文标题】使用 Parse 从预定义的 User 类中查询 PFFile【英文标题】:Query PFFile from the pre-defined User class with Parse 【发布时间】:2014-06-01 15:55:06 【问题描述】:

我认为这很琐碎,但我无法弄清楚为什么这些代码不正确。 我想从 Parse User 类中检索一张图像。我的意思是,每个用户都有一张个人资料图片,我存储在“imageFile”列下,我想将它加载到 PFImageView。上传工作正常,但我无法检索它。日志显示错误,因为查询没有匹配项。我要检索的文件存在,所以我的查询实现是错误的 100%。我非常感谢任何相关的帮助,谢谢。

非查询版本:(所有版本均在viewDidLoad实现)

    self.userThumbnail.file = self.currentUser.imageFile;
    [self.userThumbnail loadInBackground];

    查询版本

      PFQuery *queryImage = [PFQuery queryWithClassName:@"User"];
    
     [queryImage whereKey:@"imageFile" equalTo:self.currentUser]
     [queryImage getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) 
    
     if (error) 
            NSLog(@"ERROR");
         else 
            PFFile *file = [object objectForKey:@"imageFile"];
    
            self.userThumbnail.file = file;
    
            [self.userThumbnail loadInBackground];
        
    ];
    

    查询版本

     PFQuery *queryImage = [PFUser query];
     [queryImage whereKey:@"imageFile" equalTo:self.currentUser];
    
     [queryImage getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) 
    
         if (error) 
                NSLog(@"ERROR");
             else 
                PFFile *file = [object objectForKey:@"imageFile"];
    
                self.userThumbnail.file = file;
    
                [self.userThumbnail loadInBackground];
            
        ];
    

【问题讨论】:

【参考方案1】:

这一行:

[queryImage whereKey:@"imageFile" equalTo:self.currentUser];

看起来是个错误。它说,“查找其 imageFile 列(可能是 PFImage)等于当前用户对象的用户”。这永远不会是真的。

尝试将查找用户的逻辑与处理它的 imageFile 分开。换句话说。首先获取一个用户:

PFQuery *queryUser = [PFQuery queryWithClassName:@"User"];
[queryUser whereKey:@"username" equalTo:@"some-user-name"];
[queryUser getFirstObjectInBackgroundWithBlock:^(PFObject *user, NSError *error) ];

// or maybe instead of username==, get a user with their id ... 
[queryUser getObjectInBackgroundWithId:@"some-user-id" block:^(PFObject *user, NSError *error) ];

现在,在查询用户的完成块中,执行您的文件逻辑:

[queryUser getFirstObjectInBackgroundWithBlock:^(PFObject *user, NSError *error) 

    PFFile *userImageFile = user[@"imageFile"];
    [userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) 
        if (!error) 
            UIImage *image = [UIImage imageWithData:imageData];
            // this is a regular UIImage now, put it in your UI
            self.someUIImageView.image = image;
        
    ];
];

【讨论】:

感谢 danh 抽出宝贵时间帮助我。幸运的是,我刚刚用一个更简单的解决方案解决了这个问题。 PFFile *file = [self.currentUser objectForKey:@"imageFile"]; self.userThumbnail.file = file; 在这种情况下,我们不必进行查询。但我认为你的实现也是正确的,但我认为如果我们想要当前用户(如我的情况),第一部分是不必要的,但如果我们想要另一个用户的 imageFile 它可以是方式。我想我会在其他地方的块解决方案中使用这个块。 @JoeBlow - 你的意思是在块中保留循环吗?我不认为我们在上述情况下会遇到这种情况。

以上是关于使用 Parse 从预定义的 User 类中查询 PFFile的主要内容,如果未能解决你的问题,请参考以下文章

查询 Parse 数据库以从 Parse 数据类中的单个列中获取数据

解析服务器 user.getSessionToken() 未定义

Swift&Parse:查询结果,其中列类等于用户类中的列

在 Swift Parse SDK 中使用 Pointer<_User> 进行查询

IOS 如何使用 Parse Swift 获取每个用户的个人资料图片

使用两个PFUser对象查询对象时,如何更新Parse中的值?