2014-10-27 2 views
0

Я больше не могу отображать ячейки collectionview после использования данных Cloudkit через CKAssets. Раньше я использовал изображения, загруженные в папку на моем рабочем столе, только для первоначального тестирования. Теперь я использую Cloudkit, и я создал некоторые тестовые записи через панель инструментов CK, используя те же изображения. Я успешно смог запросить базу данных CK и получить ожидаемые записи. Затем я изменил свой код, чтобы заполнить данные модели для ячеек, чтобы использовать данные CK. Эти данные ранее были получены из изображений, полученных локально. Из регистрации я могу видеть, что я получаю данные с CK успешно, включая изображения. Я также вижу из регистрации, что мои пользовательские ячейки CV больше не заполняются. Из того, что я могу сказать, мой код выглядит хорошо на примерах, которые я видел в Интернете.Кадры коллекции не будут отображаться с помощью CKAsset

Может ли кто-нибудь помочь мне с этим? Спасибо!

Места инициализатор в модели ...

- (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

Хорошо, я понял это. Мой код действительно работал. Просмотр коллекции не показывался из-за проблемы многопоточности/асинхронной загрузки с данными из cloudkit. Я нажал кнопку камеры, чтобы сделать снимок, который обновил CV, и все в CV появилось. Мне просто нужно использовать многопоточность, чтобы вещи начали рендеринг при загрузке изображений.