有时Parse不会获取我的Parse类的所有对象(图像下载)

时间:2014-04-02 21:44:55

标签: ios parse-platform

我从Parse下载图片,有时获取结果比图片获得的更多错误。这是我用来下载图片的代码:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

    *PFQuery *query = [PFQuery queryWithClassName:albumToLoad];

    NSArray *objectsPFFounded=[NSArray arrayWithArray:[query findObjects]];

    int count= [objectsPFFounded count];

    int i=0;
    while (i<count){
        PFFile *userImageFile = [objectsPFFounded objectAtIndex:i][@"imageFile"];
        [userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
            if (!error) {

                if (!self.imagesGallery) {
                    self.imagesGallery = [NSMutableArray arrayWithObject:[UIImage imageWithData:imageData]];
                }else{
                    [self.imagesGallery addObject:[UIImage imageWithData:imageData]];
                }

            }
        }];
        i++;
    }
    dispatch_async(dispatch_get_main_queue(), ^{
      [self updateCollectionViewWhenBackgroundDone];
        });
    });

我从控制台得到这个错误:

    Could not save HTTP response body to /var/mobile/Applications/D96AFE9B-17EF-4630-8608-423D721394F3/Library/Caches/Parse/PFFileCache/578df836-a12c-4e70-b389-033efa647ee5-28.jpg: Error Domain=NSCocoaErrorDomain Code=516 "The operation couldn’t be completed. (Cocoa error 516.)" UserInfo=0x16ed58a0 {NSSourceFilePathErrorKey=/private/var/mobile/Applications/D96AFE9B-17EF-4630-8608-423D721394F3/tmp/PFHTTPCommand0x16ddd220, NSUserStringVariant=( Move ), 
NSFilePath=/private/var/mobile/Applications/D96AFE9B-17EF-4630-8608-423D721394F3/tmp/PFHTTPCommand0x16ddd220, NSDestinationFilePath=/var/mobile/Applications/D96AFE9B-17EF-4630-8608-423D721394F3/Library/Caches/Parse/PFFileCache/578df836-a12c-4e70-b389-033efa647ee5-28.jpg, NSUnderlyingError=0x16ee8350 "The operation couldn’t be completed. File exists"}

在获取对象之前,是否要删除临时目录或缓存目录?我该如何解决这个问题?

由于

3 个答案:

答案 0 :(得分:3)

可可错误516表示文件已存在。在您的情况下,似乎图像文件已存在于本地缓存中。

在致电isDataAvailable()之前,您可以先尝试使用getDataInBackgroundWithBlock进行核对。

另外,我认为这是警告应该是解析中的错误。确保您使用的是最新版本的解析框架。

答案 1 :(得分:2)

在我的情况下,错误发生在以下情况:

我第一次加载PFFile。它是从服务器加载的,因为它尚未缓存。在加载过程中,缓存显然正在进行中。

当文件仍在加载时,它在不同的上下文中再次被请求。由于缓存尚未完成,因此再次执行了服务器请求。第二个服务器请求显然再次启动缓存文件,iOS抱怨错误516(文件存在)。第二个服务器请求因此错误终止,而不返回文件数据。我认为这是一个Parse bug。

我使用的解决方法是存储正在进行的文件请求,并将新请求延迟到同一文件,以使系统有机会完成写入缓存文件。这很有效。

当然,更好的方法是对同一文件的请求进行排队,以便只有在第一个请求完成后才会执行进一步的请求,以便从缓存中提供这些请求。

答案 2 :(得分:0)

我明白了。我试图在一个不正确的线程中重新加载我的集合视图。这看起来是我的最终代码。它就像一个魅力

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

      PFQuery *query = [PFQuery queryWithClassName:albumToLoad];

      [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
          if (!error){
              if (objects.count > 0){
                  for (PFObject *eachObject in objects){
                      PFFile *userImageFile = [eachObject objectForKey:@"imageFile"];
                      PFImageView *imageViewParse=[[PFImageView alloc] init];
                      imageViewParse.file=userImageFile;
                      [imageViewParse loadInBackground:^(UIImage *image, NSError *error) {
                          if (!error){
                            if (!self.imagesGallery) {
                                  self.imagesGallery = [NSMutableArray arrayWithObject:image];
                            }else{
                                  [self.imagesGallery addObject:image];
                            }

                              if ([self.imagesGallery count] == objects.count){
                                  dispatch_async(dispatch_get_main_queue(), ^{

                                      [self updateCollectionViewWhenBackgroundDone];

                                  });
                              }
                          }
                      }];


                }

              }

          }
      }];

  });