核心数据上下文崩溃

时间:2018-03-30 15:15:56

标签: multithreading core-data thread-safety nsmanagedobjectcontext

我正在努力将图像保存到核心数据。我使用图像选择来选择图像,

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let currentDateTime = Date()
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        self.imagePickedBlock?(image,currentDateTime)
    } else {
        print("Something went wrong")
    }

    viewController?.dismiss(animated: true, completion:{
            if let addPhotoViewController = self.completionViewController as? AddPhotoViewController {
                guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else {return }
                addPhotoViewController.photoViewModel.image = image
            self.viewController?.present(addPhotoViewController, animated: true, completion: nil) 
            }
    })
}

在addPhotoViewController中,我有一个确认按钮来调用以下更新数据库方法。 Photo是一个NSManagedObject。

  private func updateDatabase(with photoViewModels: [PhotoViewModel]) {
    container?.performBackgroundTask {  [weak self] context in
        for photoViewModel in (self?.photoViewModels)! {
            _ = try? Photo.findOrCreatePhoto(matching: photoViewModel, in: context)
        }
        try? context.save()
        self?.printDatabaseStatistics()
    }
}

And this is the create NSManagedObject method. 

  static func findOrCreatePhoto(matching photoViewModel: PhotoViewModel, in context: NSManagedObjectContext) throws -> Photo {
    let request : NSFetchRequest<Photo> = Photo.fetchRequest()
    // request.predicate if Needed
    do {
        let matches = try context.fetch(request)
        if matches.count > 0 {
            return matches[0]
        }
    } catch {
        throw error
    }

    let photo = Photo(context:context) // the crash line 
    photo.image = UIImageJPEGRepresentation(photoViewModel.image!, 1)
    photo.uploadDate = photoViewModel.createDate
    photo.text = photoViewModel.description
    //       photo.group = try? Group.findOrCreateGroup(matching: photoViewModel, in: context)
    return photo
}. 

它标志着#34;从com.apple.main-thread&#34;排队,我真的不明白线程的问题在哪里,任何人都有想法?如果我没有解释清楚,请不要犹豫:) 感谢您的时间。

0 个答案:

没有答案