在Parse iOS中抓取每个对象的第一张图像

时间:2014-05-28 16:16:28

标签: ios objective-c uicollectionview parse-platform

对于措辞不佳的头衔感到抱歉。我有一个逻辑问题,我试图解决这个问题。我工作的观点有UICollectionView,显示"坦克列表"与用户相关联。此集合视图显示三个项目:

  • 坦克名称
  • 坦克容量
  • 存储的最后一张图片

最后一张图片存储部分是我遇到麻烦的地方。我正在取得进步,但这是我不确定的背后的逻辑问题。以下是数据的样子:

我有两个与我互动的课程; SavedTanksSavedTankImages。来自已保存槽的唯一objectId也存储为SavedTankImages中的值,以允许对图像的一种指针引用。当用户加载"坦克时,该逻辑有效。并且可以看到他们存储的与之相关的所有图像。

然而,出于这个观点的目的,我只需要抓住每个坦克的第一张图像并显示它。这是我需要帮助的地方。这就是我到目前为止所拥有的:

#pragma mark COLLECTION VIEW
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"Cell";
photoHandler *cell = (photoHandler *)[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
_tankNameArray = [_array objectAtIndex:indexPath.section * 1 + indexPath.row];
cell.tankNameLabel.text = [_tankNameArray valueForKey:@"tankName"];
cell.tankCapLabel.text = [_tankNameArray valueForKey:@"tankCapacity"];
NSArray *objectId = [_array valueForKey:@"objectId"];

for (int i = 0; i < objectId.count; i++)
{
    NSString *objectString = [[NSString alloc] init];
    objectString = [objectId objectAtIndex:i];

    PFQuery *imageQuery = [PFQuery queryWithClassName:@"SavedTankImages"];
    [imageQuery whereKey:@"tankObjectId" equalTo:objectString];
    [imageQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error)
        {
            for (PFObject *object in objects)
            {
                NSLog(@"OBJECT TEST: %@", object);
            }
        }
    }];
}
return cell;
}

OBJECT TEST: %@上,这是记录的输出:

2014-05-28 11:59:44.750 ReefTrack[305:60b] OBJECT TEST: <SavedTankImages:U6fRTuRo2c:    (null)> {
tankImages = "<PFFile: 0x18a25890>";
tankObjectId = tsz4yvrIAN;
}

SavedTankImages: <x>是单个图片的objectId,而tankObjectId是与图片相关联的储罐。我已经接近了,但我需要知道如何有效地进行迭代,并且只抓取tankObjectId与原始objectId匹配的第一个项目。如果这听起来有点复杂,请原谅我。

感谢您提前帮助。

更新

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";
    photoHandler *cell = (photoHandler *)[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
    _tankNameArray = [_array objectAtIndex:indexPath.section * 1 + indexPath.row];
    cell.tankNameLabel.text = [_tankNameArray valueForKey:@"tankName"];
    cell.tankCapLabel.text = [_tankNameArray valueForKey:@"tankCapacity"];
    NSArray *objectId = [_array valueForKey:@"objectId"];

    for (int i = 0; i < objectId.count; i++)
    {
//        NSString *objectString = [[NSString alloc] init];
//        objectString = [objectId objectAtIndex:i];
        PFQuery *imageQuery = [PFQuery queryWithClassName:@"SavedTankImages"];
        [imageQuery whereKey:@"tankObjectId" equalTo:[objectId objectAtIndex:i]];
        [imageQuery getFirstObjectInBackgroundWithBlock:^(PFObject *objects, NSError *error)
        {
            if (!error)
            {
                PFFile *imageFile = [objects valueForKey:@"tankImages"];
                [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
                    if (!error)
                    {
                        cell.parseImage.image = [UIImage imageWithData:data];
                    }
                }];
                NSLog(@"Heres your image: %@", objects);
            }
        }];
    }

    return cell;
}

以上代码选择第一个可用图像,并使其成为collectionView中每个单元格的背景。我想得到它,以便它只返回objectId的第一个图像。换句话说

  • 坦克1 =坦克1图像1
  • 坦克2 =坦克2图像1
  • 坦克3 =坦克3图像1

现在这就是它正在做的事情:

  • 坦克1 =坦克1图像1
  • 坦克2 =坦克1图像1
  • 坦克3 =坦克1图像1

1 个答案:

答案 0 :(得分:1)

简单的解决方案,排序并获取第一个结果。请注意,这不如下一个解决方案有效:

// sort by createdAt or use updatedAt
[imageQuery orderByDescending:@"createdAt"];
// change from find to getFirst
//[imageQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
[imageQuery getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
    if (!error)
    {
        NSLog(@"OBJECT TEST: %@", object);
    }
}];

如果您经常要查询此更高级的解决方案是存储指向坦克上最新对象的指针。您可以在代码中执行此操作,也可以创建一个Cloud Code方法,在每个SavedTankImages对象保存后自动更新它(它只会加载相关的SavedTanks并将mostRecentImage设置为指向保存图像,然后保存SavedTanks)。

如果您已完成此操作,则可以使用include:方法将mostRecentImage加载到SavedTanks