应用程序冻结,直到下载并显示图像。解析

时间:2015-08-16 19:37:45

标签: ios objective-c asynchronous parse-platform

我正在使用Parse.com 当我在viewDidAppear中下载我的PFFile(包含图像)时,我的应用程序冻结了一段时间,然后它显示了图片。但那是不对的。我想要UIActivityIndi​​catorView动画或至少显示。我知道这涉及异步或其他东西。但我不知道如何使这项工作正确。

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

2 个答案:

答案 0 :(得分:0)

这是因为您没有在后台获取对象。尝试使用查询来完成此任务。如果您需要更多信息,我可以给您完整的查询,因为我在我的应用程序中有这个代码:)

示例代码:

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {}];

获取包含数据的图像:

PFFile *imageFile = [object objectForKey:@"YOURKEY"];
            [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {}];

答案 1 :(得分:0)

您的代码存在一些问题

  1. 您的查询不正确,我无法理解这部分[query valueForKey:@"profilePic"];如果您想让用户拥有个人资料图片,那么您应该执行此类[query whereKeyExist:@"profilePic"];,但此刻查询你将删除所有对象。

  2. 您正在主线程中下载图片,让您的应用免费,您应该做这样的事情

  3. [imageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
        if (!error)
    { 
    self.profilePic.image = [UIImage imageWithData:imageData];
     }                   
    }];
    
    1. 在调用data.count之前,您必须先检查data[0],如果数据数组为nil或为空,这可能会导致应用程序崩溃。
    2. <强>更新 获取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];
               }                   
              }]; 
              }];
          }