Collectionview单元格不会使用CKAsset进行渲染

时间:2014-10-27 21:25:03

标签: ios8 uicollectionview cloudkit

在通过CKAssets使用Cloudkit中的数据后,我无法再渲染collectionview单元格。我以前使用加载在桌面上的文件夹中的图像进行初始测试。我现在正在使用Cloudkit,并且我使用相同的图像通过CK仪表板创建了一些测试记录。我成功地查询了CK数据库并检索了预期的记录。然后我更改了我的代码以填充单元格的模型数据以使用CK数据。该数据以前来自本地检索的图像。我可以从日志中看到我成功从CK获取数据,包括图像。我还可以从日志记录中看到我的自定义CV单元不再被初始化。据我所知,根据我在网上看到的例子,我的代码看起来不错。

任何人都可以帮我吗?谢谢!

模型中的指定初始化程序...

- (instancetype)initImagesForSelection:(NSString *)selectionType {

    self = [super init];

    if (self) {
        CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ImageDescription = 'description'"];
        CKQuery *query = [[CKQuery alloc] initWithRecordType:@"ImageData" predicate:predicate];

        [publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {
            // handle the error
            if (error) {
                NSLog(@"Error: there was an error querying the cloud... %@", error);
            } else {
                // any results?
                if ([results count] > 0) {
                    NSLog(@"Success querying the cloud for %lu results!!!", (unsigned long)[results count]);
                    for (CKRecord *record in results) {
                        ImageData *imageData = [[ImageData alloc] init];
                        CKAsset *imageAsset = record[@"Image"];
                        imageData.imageURL = imageAsset.fileURL;
                        NSLog(@"asset URL: %@", imageData.imageURL);
                        imageData.imageName = record[@"ImageName"];
                        //imageData.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageAsset.fileURL]];
                        imageData.image = [UIImage imageWithContentsOfFile:imageAsset.fileURL.path];
                        NSLog(@"image size height:%f, width:%f", imageData.image.size.height, imageData.image.size.width);
                        [self.imageDataArray addObject:imageData];
                    }
                    NSLog(@"imageDataArray size %lu", (unsigned long)[self.imageDataArray count]);
                }
            }
        }];
    }

    return self;
}

Collectionview viewcontroller在从Cloudkit中提取数据之前完美运行...

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

    static NSString *CellIdentifier = @"Cell"; // string value identifier for cell reuse
    ImageViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
    NSLog(@"cellForItemAtIndexPath: section:%ld row:%ld", (long)indexPath.section, (long)indexPath.row);
    cell.layer.borderWidth = 1.0;
    cell.layer.borderColor = [UIColor grayColor].CGColor;

    ImageData *imageData = [self.imageLoadManager imageDataForCell:indexPath.row];

    cell.imageView.image = imageData.image;

    cell.imageView.contentMode = UIViewContentModeScaleAspectFit; 

    return cell;
}

1 个答案:

答案 0 :(得分:1)

好的,我想出来了。我的代码实际上正在运行。由于来自cloudkit的数据存在多线程/异步下载问题,因此未显示collectionview。我按下相机按钮拍摄照片,刷新了CV,CV中的所有内容都出现了。我只需要使用多线程,这样就可以在下载图像时开始渲染。