从解析iOS下载图像

从解析iOS下载图像,ios,objective-c,parse-platform,Ios,Objective C,Parse Platform,我正在编写一个应用程序,允许用户在解析时获取和存储图像。到目前为止,我通过使用以下逻辑成功地保存了要解析的图像数组: 拍照 将对象添加到数组 将数组转换为NSData 将NSData转换为PFFile 设置文件上载目标(通过唯一objectId) 上载要解析的文件 这就是代码的样子;请原谅它现在在dismissViewController中,我只是想让它成功保存: - (void) imagePickerController:(UIImagePickerController *)picker

我正在编写一个应用程序,允许用户在解析时获取和存储图像。到目前为止,我通过使用以下逻辑成功地保存了要解析的图像数组:

  • 拍照
  • 将对象添加到数组
  • 将数组转换为NSData
  • 将NSData转换为PFFile
  • 设置文件上载目标(通过唯一objectId)
  • 上载要解析的文件
这就是代码的样子;请原谅它现在在dismissViewController中,我只是想让它成功保存:

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
_takenImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage];
[self dismissViewControllerAnimated:YES completion:^
{
    // Add object to array: Working
    [_tankImagesArray addObject:_takenImage];
    NSLog(@"Number of images taken: %lu", (unsigned long)_tankImagesArray.count);

    // Convert array to NSData Object
    NSData *imageData = [NSKeyedArchiver archivedDataWithRootObject:_tankImagesArray];

    // Convert NSData Object to PFFile
    PFFile *imageFile = [PFFile fileWithData:imageData];

    PFQuery *tankQuery = [PFQuery queryWithClassName:@"SavedTanks"];
    _tankObject = [tankQuery getObjectWithId:_passedValue];

    [_tankObject setObject:imageFile forKey:@"tankImages"];

    [_tankObject save];
}];
}
现在,我的问题是:我该如何准确地检索该文件?我在这里的最终目标是允许用户查看他们过去拍摄的图片,并将其添加到收藏中的图片列表中,然后将其上载到服务器。我只是不确定文件上传后如何检索并确保其完整性。

您是否尝试过:

PFQuery *query = [PFQuery queryWithClassName:@"SavedTanks"];
[query whereKey:@"tankImages" equalTo:@"your_image.jpg"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
  if (!error) {
    // The find succeeded.
    NSLog(@"Successfully retrieved %d images.", objects.count);
    // Do something with the found objects
    for (PFObject *object in objects) {
        NSLog(@"%@", object.objectId);
    }
  } else {
    // Log details of the failure
    NSLog(@"Error: %@ %@", error, [error userInfo]);
  }
}];

在集合视图的.h文件中,需要有如下内容。请注意,我构建的一个可以让您喜欢图像,然后使用段控制器对喜欢的图像进行排序

#import <UIKit/UIKit.h>
#import "UICollectionCell.h"
#import <Parse/Parse.h>

@interface ParseViewController : UIViewController {

    NSArray *imageFilesArray;
    NSMutableArray *imagesArray;
}

@property (weak, nonatomic) IBOutlet UICollectionView *imagesCollection;
- (IBAction)segmentSelected:(id)sender;
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentedController;



@end

希望这对您有所帮助。

以上所有解决方案都是正确的,但希望添加另一种方式,以支持SDWebImage或任何类似库的图像缓存。 成功完成后,您将拥有
PFFile
,其属性“url”将返回保存图像的实际url。您可以使用它来加载图像。使用这种方法,我能够基于键作为URL进行图像缓存

...
NSString *strUrl = pfFileObject.url;
...
...
[img sd_setImageWithURL:[NSURL URLWithString:strUrl]];

为什么要从parse下载照片,因为用户已经在本地拥有这些照片

我建议您使用:

您还可以将本地照片保存到缓存中,以便轻松访问它们,从而不需要从parse下载任何照片

现在,如果您仍然想从parse下载照片,只需进行普通查询并下载所有照片parse对象,您将在PFObject中获得照片的PFFile

例如:

PFQuery *query = [PFQuery queryWithClassName:@"SavedTanks"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        for(PFObject *obj in objects){
            PFFile *file = [obj objectForKey:@"tankImages"];

            // now you can use this url to download the photo with AFNetwork
            NSLog(@"%@",file.url);
        }
    }
}];

现在试试这个。尽管我的另一个问题是,我首先保存图像进行解析的执行是否正确?我不确定这里的PFFile格式是否正确。如果我想返回并让用户添加更多图像,我是否遵循了正确的逻辑?我在这里看到的第一件事是,您将在imagePickerController的每个选择上从阵列发送相同的图像。您只需发送所选图像,而不用麻烦将图像存储在arrayI中,我不确定这是否属实;我将tankImagesArray转换为NSData对象,然后将NSData对象转换为PFFile,然后上载该文件。我可以确认上传多个图像时解析中的文件大小增加。也许我看错了?更改此
NSData*imageData=[NSKeyedArchiver archivedDataWithRootObject:_tankImagesArray]到此
NSData*imageData=[NSKeyedArchiver archivedDataWithRootObject:_takenImage]并重试。已更改。更新我的问题以提供更多信息。我在这方面取得了一些成功,但collectionView没有绘制。你有没有想过为什么不会呢;我正在使用UICollectionView显示结果。
...
NSString *strUrl = pfFileObject.url;
...
...
[img sd_setImageWithURL:[NSURL URLWithString:strUrl]];
PFQuery *query = [PFQuery queryWithClassName:@"SavedTanks"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        for(PFObject *obj in objects){
            PFFile *file = [obj objectForKey:@"tankImages"];

            // now you can use this url to download the photo with AFNetwork
            NSLog(@"%@",file.url);
        }
    }
}];