我正在使用Parse.com 当我在viewDidAppear中下载我的PFFile(包含图像)时,我的应用程序冻结了一段时间,然后它显示了图片。但那是不对的。我想要UIActivityIndicatorView动画或至少显示。我知道这涉及异步或其他东西。但我不知道如何使这项工作正确。
PFFile* imageFile = [[PFUser currentUser] objectForKey:@"profilePic"];
if (imageFile) {
self.activity.hidden = NO;
[self.activity startAnimating];
NSURL* imageFileUrl = [[NSURL alloc]initWithString:imageFile.url];
NSData* imageData = [NSData dataWithContentsOfURL:imageFileUrl];
self.profilePic.image = [UIImage imageWithData:imageData];
}
下载图像并显示。
UPD:
PFQuery* query = [PFUser query];
[query valueForKey:@"profilePic"];
[query findObjectsInBackgroundWithBlock:^(NSArray* data, NSError* error)
{
PFFile* imageFile = data[0];
[imageFile getDataInBackgroundWithBlock:^(NSData* data,NSError* error){
if (!error) {
self.activity.hidden = NO;
[self.activity startAnimating];
NSURL* imageFileUrl = [[NSURL alloc]initWithString:imageFile.url];
NSData* imageData = [NSData dataWithContentsOfURL:imageFileUrl];
self.profilePic.image = [UIImage imageWithData:imageData];
}else{
self.profilePic.image = [UIImage imageNamed:@"profile@2.png"];
}
}];
}];
UPD 2:
这解决了我的问题。这两个答案都很有用。
PFQuery* query = [PFUser query];
[query getObjectInBackgroundWithId:[PFUser currentUser].objectId block:^(PFObject* object, NSError* error){
if(!error){
PFFile* imageFile = object[@"profilePic"];
[imageFile getDataInBackgroundWithBlock:^(NSData* data, NSError* error) {
if (!error) {
self.activity.hidden = NO;
[self.activity startAnimating];
self.profilePic.image = [UIImage imageWithData:data];
NSLog(@"Profile pic shown");
}
else{
NSLog(@"Error 2: %@",error);
}
}];
}else{
self.profilePic.image = [UIImage imageNamed:@"profile@2.png"];
NSLog(@"Fail 1 : %@",error);
}
}];
答案 0 :(得分:0)
这是因为您没有在后台获取对象。尝试使用查询来完成此任务。如果您需要更多信息,我可以给您完整的查询,因为我在我的应用程序中有这个代码:)
示例代码:
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {}];
获取包含数据的图像:
PFFile *imageFile = [object objectForKey:@"YOURKEY"];
[imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {}];
答案 1 :(得分:0)
您的代码存在一些问题
您的查询不正确,我无法理解这部分[query valueForKey:@"profilePic"];
如果您想让用户拥有个人资料图片,那么您应该执行此类[query whereKeyExist:@"profilePic"];
,但此刻查询你将删除所有对象。
您正在主线程中下载图片,让您的应用免费,您应该做这样的事情
[imageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) { if (!error) { self.profilePic.image = [UIImage imageWithData:imageData]; } }];
data.count
之前,您必须先检查data[0]
,如果数据数组为nil
或为空,这可能会导致应用程序崩溃。<强>更新强> 获取currentUser的个人资料照片将是这样的
PFUser *currentUser = [PFuser currentUser];
if (!currentUser)
{
//need to login
}
else
{
// may be you need to fetch
__weak typeof(self) weakSelf = self;
[currentUser fetchIfNeededInBackgroundWithBlock:^(PFObject *obj, NSError *error){
PFFile* imageFile = [[PFUser currentUser] objectForKey:@"profilePic"];
[imageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
if (!error)
{
weakSelf.profilePic.image = [UIImage imageWithData:imageData];
}
}];
}];
}