对于措辞不佳的头衔感到抱歉。我有一个逻辑问题,我试图解决这个问题。我工作的观点有UICollectionView
,显示"坦克列表"与用户相关联。此集合视图显示三个项目:
最后一张图片存储部分是我遇到麻烦的地方。我正在取得进步,但这是我不确定的背后的逻辑问题。以下是数据的样子:
我有两个与我互动的课程; SavedTanks
和SavedTankImages
。来自已保存槽的唯一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的第一个图像。换句话说
现在这就是它正在做的事情:
答案 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
。