«LPMetadataProvider-это одноразовый объект». что это значит?

#swift #uicollectionview #metadata

Вопрос:

Я хочу получить «предварительный просмотр ссылок» в ячейке collectionview с помощью LPMetaDataProvider.

Все работает хорошо. Но всякий раз, когда прокручивается представление коллекции и ячейка исчезает (или отображается снова), я получаю эту ошибку:

«Пытаюсь начать выборку на LPMetadataProvider, который уже запущен. LPMetadataProvider-это одноразовый объект.» Есть идеи ?

     var urlString: String?

    var previewCell: LinkModel? {
    
    didSet {
      
        urlString = previewCell?.linkURL
        
        fetchPreview()
    }
}

   let linkPreview = LPLinkView()
   let provideer = LPMetadataProvider()


   override init(frame: CGRect) {
         super.init(frame: frame)
    contentView.backgroundColor = .black
    
  
     }

fileprivate func fetchPreview() {

    guard let url = URL(string: urlString ?? "") else {return}

    
    provideer.startFetchingMetadata(for: url) { metaData, error in

        guard let data = metaData, error == nil else {
            
        
            return
        }
        DispatchQueue.main.async  {
            self.linkPreview.metadata = data
            self.contentView.addSubview(self.linkPreview)
            self.linkPreview.frame = (self.contentView.bounds)
        }
    }
}
 

Если я вызову функцию в «переопределить инициализацию», все будет работать нормально, но на этот раз она не получит «urlString» из didset. Я буду рад, если вы поможете

Комментарии:

1. Большое вам спасибо, это имеет смысл и работает @Sweeper

Ответ №1:

Создайте provider локальную переменную в fetchPreview .

 fileprivate func fetchPreview() {

    guard let url = URL(string: urlString ?? "") else { return }
    let provideer = LPMetadataProvider()
    provider.startFetchingMetadata(for: url) { metaData, error in
        ...
 

«Одноразовый» означает, что вы должны использовать этот объект один раз, а затем выбросить его.