我从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"}
在获取对象之前,是否要删除临时目录或缓存目录?我该如何解决这个问题?
由于
答案 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];
});
}
}
}];
}
}
}
}];
});