0

За последние несколько дней я пытаюсь заполнить UICollectionView новыми изображениями данных, нажав кнопку «newCollection» из представления, которое существует в виде коллекции. Я вижу на моей консоли, что данные для изображений загружаются, и я могу видеть ячейки CV, заполненные, как только я покинул представление, а затем вернусь. Любая идея, почему ячейки просмотра коллекции не обновляются в реальном времени?Ячейки UICollectionView, обработанные NSFetchedResultsController, не возвращающие изображения

Вот что я работаю с:

https://github.com/tdangles81/Virtual-Tourist/tree/detail-view

@IBAction func newCollectionBtn(sender: AnyObject) { 
    getNewCollection() 
} 

func getNewCollection(){ 
    if let newFetch = self.fetchedResultsController.fetchedObjects{ 
     for object in newFetch{ 
      let newImg = object as! ImgModel 
      self.sharedContext.deleteObject(newImg) 
     } 
    } 
    FlickrRequestClient.sharedInstance().getNewGeoImgs(selectedPin) 
} 

var sharedContext: NSManagedObjectContext { 
    return CoreDataStack.sharedInstance().managedObjectContext 
} 

func saveContext(){ 
    return CoreDataStack.sharedInstance().saveContext() 
} 

lazy var fetchedResultsController: NSFetchedResultsController = { 

    let fetchRequest = NSFetchRequest(entityName: "Image") 
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "id", ascending: true)] 
    fetchRequest.predicate = NSPredicate(format: "pin == %@", self.selectedPin) 

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, 
                   managedObjectContext: self.sharedContext, 
                   sectionNameKeyPath: nil, cacheName: nil) 
    return fetchedResultsController 
}() 

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier("pin") as? MKPinAnnotationView 
    if pinView == nil{ 
     pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin") 
    }else{ 
     pinView?.annotation = annotation 
    } 
    return pinView 
    } 


func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    return fetchedResultsController.sections?.count ?? 0 
} 

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    let sectionInfo = self.fetchedResultsController.sections![section] 
    print(sectionInfo.numberOfObjects) 
    return sectionInfo.numberOfObjects 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("DetailCell", forIndexPath: indexPath) as! ImageCollectionCell 
    let image = fetchedResultsController.objectAtIndexPath(indexPath) as! ImgModel 

    configureUI(cell, image: image, atIndexPath: indexPath) 
    return cell 
} 

func configureUI(cell: ImageCollectionCell, image: ImgModel, atIndexPath indexPath: NSIndexPath) { 

    if image.image != nil{ 
     image.loadUpdateHandler = nil 
     cell.flickrImageView.image = image.image! 
     print("Image.image \(image.image!)") 
     self.saveContext() 
    }else{ 
     image.loadUpdateHandler = {[unowned self]() -> Void in 
     dispatch_async(dispatch_get_main_queue(), { 
     self.collectionView.reloadData() 
      }) 
     } 
     cell.flickrImageView.image = image.image 
    } 
} 

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){ 
    if collectionView.cellForItemAtIndexPath(indexPath) != nil { 
     let image = fetchedResultsController.objectAtIndexPath(indexPath) as! ImgModel 
     print(image) 
    } 
} 

func controllerWillChangeContent(controller: NSFetchedResultsController) { 

    insertedIndex = [NSIndexPath]() 
    updatedIndex = [NSIndexPath]() 
    deletedIndex = [NSIndexPath]() 
} 

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 
    switch type { 
    case .Insert: 
     insertedIndex.append(newIndexPath!) 
    case .Update: 
     updatedIndex.append(indexPath!) 
    case .Move: 
     print("Surprise!") 
    case .Delete: 
     deletedIndex.append(indexPath!) 
    } 
} 

func controllerDidChangeContent(controller: NSFetchedResultsController) { 
    collectionView.performBatchUpdates({() -> Void in 
     for indexPath in self.insertedIndex { 
      self.collectionView.insertItemsAtIndexPaths([indexPath]) 
     } 
     for indexPath in self.updatedIndex { 
      self.collectionView.reloadItemsAtIndexPaths([indexPath]) 
     } 
     for indexPath in self.deletedIndex { 
      self.collectionView.deleteItemsAtIndexPaths([indexPath]) 
     } 
     },completion: nil) 

} 

func addSpinner(cellView: UICollectionViewCell, activityBool: Bool){ 

    let activitySpinner =  UIActivityIndicatorView.init(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge) 
    activitySpinner.center = cellView.center 
    activitySpinner.color = UIColor.whiteColor() 
    activitySpinner.startAnimating() 

    if activityBool == true{ 
     activitySpinner.startAnimating() 
     cellView.addSubview(activitySpinner) 
    }else if activityBool == false{ 
     activitySpinner.stopAnimating() 
     cellView.willRemoveSubview(activitySpinner) 
    } 
} 

func removeSpinner(){ 

} 

} 
+0

попробуйте использовать изображения с низким разрешением – JAck

+0

Это, к сожалению, не нашло трюка. Я думаю, что это имеет какое-то отношение к обновлению пользовательского интерфейса в основном потоке. Ум взглянул сюда? https://github.com/tdangles81/Virtual-Tourist/tree/detail-view –

ответ

1

проблема возникает в поведении NSFetchedResultsController. Если в запросе выборки установлен NSPredicate, методы делегата не вызываются.

Попробуйте удалить предикат, чтобы узнать, есть ли у вас эта проблема.

Я пытаюсь выяснить, является ли это ошибкой в ​​Xcode или некорректной ошибкой, связанной с ошибками, или если в классе NSFetchedResultsController используется новая маркерная система запроса, и нам нужно что-то сделать.

+0

Я решил проблему, но в конце концов понял, что я не установил делегат fetchedResultsController. –