Ios 如何在coredata swift3中同时保存和获取数据

Ios 如何在coredata swift3中同时保存和获取数据,ios,swift,core-data,Ios,Swift,Core Data,在我当前的项目中,我正在保存数据,如(图像属性)进入coredata,但在立即获取数据时,它没有给出确切的数据数量。大多数情况下,提供的数据数量少于我保存的数据数量。但在日志中,它显示所有数据都已成功保存。我的任务是在获取之前,我可以看到日志,因此没有数据未正确保存的问题。请帮助我获取解决这个问题 func saveImageDetails(aImage: UIImage?, imageUrl: String!, phAsset: PHAsset!, objectType: String, ob

在我当前的项目中,我正在保存数据,如(图像属性)进入coredata,但在立即获取数据时,它没有给出确切的数据数量。大多数情况下,提供的数据数量少于我保存的数据数量。但在日志中,它显示所有数据都已成功保存。我的任务是在获取之前,我可以看到日志,因此没有数据未正确保存的问题。请帮助我获取解决这个问题

func saveImageDetails(aImage: UIImage?, imageUrl: String!, phAsset: PHAsset!, objectType: String, objectId: String, objectName:String,location: String?){

        if let newImage = aImage {

            let   date  = HelpherMethod.sharedInstance().toLocalTime(Date())
            let resource = PHAssetResource.assetResources(for: phAsset!).first
            let fileName = resource?.originalFilename
            var  imageName : String?
            let timestamp = date?.timeIntervalSince1970
            print(String(format:"%.0f",timestamp!))
            let currentTimeStamp = String(format:"%.0f",timestamp!)
            imageName = String(format:"%@_%@",AuthService.instance.userName,currentTimeStamp)

            let mImage = self.objectWithTypePredicate(aType: "Image", predicate: NSPredicate(format:"(imageName == %@)",imageName!), canCreate: true)

            mImage?.setValue(fileName, forKey: "fileName")
            mImage?.setValue(date, forKey: "dateTime")
            mImage?.setValue(objectId, forKey: "objectId")
            mImage?.setValue(objectType, forKey: "objectType")
            mImage?.setValue(objectName, forKey: "objectName")
            mImage?.setValue(newImage, forKey: "image")
            mImage?.setValue(imageName, forKey: "imageName")
            mImage?.setValue(imageUrl, forKey: "imageUrl")
            if let loc = location {
                mImage?.setValue(loc, forKey: "location")
            }
            mImage?.setValue("progress", forKey: "status") //Status failed for not uploaded // progress for processing// success for sync// at the initial level all status are set to progress
            do {
                try mImage?.managedObjectContext?.save()
            } catch {
                fatalError("Failure to save context: \(error)")
            }
        }
   }


//fethcing from coredata

func fetchRecordsWithClassName(entityName: String , sortingKey: String , isAscending: Bool , predicate: NSPredicate? , isAllrecord: Bool ) -> Array<Any>{


         let   managedContext = PLMCoreDataInstance.managedObjectContext
        // Initialize Fetch Request
        let fetchRequest  =  NSFetchRequest<NSFetchRequestResult>() as NSFetchRequest
        //create entity description
        let entityDescription = NSEntityDescription.entity(forEntityName: entityName, in: managedContext!)
        let sortDescriptor = NSSortDescriptor(key: sortingKey, ascending: isAscending)
        fetchRequest.sortDescriptors = [sortDescriptor]
        // optional chaining
        if let newPredicate = predicate {
            fetchRequest.predicate = newPredicate
        }
        //Configure fetch Request
        fetchRequest.entity = entityDescription
        do {
            if let results = try? managedContext?.fetch(fetchRequest)  {
                return results!
            }
        }
        return []
    }
func saveImageDetails(aImage:UIImage?、imageUrl:String!、phAsset:phAsset!、objectType:String、objectId:String、objectName:String、location:String?){
如果让newImage=aImage{
让date=HelpherMethod.sharedInstance().toLocalTime(日期())
让resource=PhaseSetResource.assetResources(for:phAsset!)。首先
让fileName=resource?.originalFilename
var-imageName:String?
让时间戳=日期?时间间隔自1970年起
打印(字符串(格式:%.0f”,时间戳!))
让currentTimeStamp=字符串(格式:%.0f”,时间戳!)
imageName=String(格式:“%@U%@”、AuthService.instance.userName、currentTimeStamp)
让mImage=self.objectWithTypePredicate(类型:“Image”,谓词:NSPredicate(格式:“(imageName==%@)”,imageName!),canCreate:true)
mImage?.setValue(文件名,forKey:“文件名”)
mImage?.setValue(日期,forKey:“日期时间”)
mImage?.setValue(objectId,forKey:“objectId”)
mImage?.setValue(objectType,forKey:“objectType”)
mImage?.setValue(objectName,forKey:“objectName”)
mImage?.setValue(新图像,forKey:“图像”)
mImage?.setValue(imageName,forKey:“imageName”)
mImage?.setValue(imageUrl,forKey:“imageUrl”)
如果let loc=位置{
mImage?.setValue(位置,forKey:“位置”)
}
mImage?.setValue(“progress”,forKey:“status”)//未上载状态失败//处理进度//同步成功//在初始级别,所有状态都设置为progress
做{
请尝试mImage?.managedObjectContext?.save()
}抓住{
fatalError(“保存上下文失败:\(错误)”)
}
}
}
//coredata场效应
func fetchRecordsWithClassName(entityName:String,sortingKey:String,isAscending:Bool,谓词:NSPredicate?,isAllrecord:Bool)->数组{
让managedContext=PLMCoreDataInstance.managedObjectContext
//初始化提取请求
将fetchRequest=NSFetchRequest()设为NSFetchRequest
//创建实体描述
让entityDescription=NSEntityDescription.entity(forEntityName:entityName,in:managedContext!)
让sortDescriptor=NSSortDescriptor(键:sortingKey,升序:isAscending)
fetchRequest.sortDescriptors=[sortDescriptor]
//可选链接
如果让newPredicate=谓词{
fetchRequest.predicate=newPredicate
}
//配置提取请求
fetchRequest.entity=entityDescription
做{
如果let results=try?managedContext?.fetch(fetchRequest){
返回结果!
}
}
返回[]
}
VIEWCONTROLLER--1: =========================>

import UIKit

import CoreData



class ViewController-1: UIViewController,UITableViewDelegate,UITableViewDataSource

{

    @IBOutlet var table_view: UITableView!

    var my_data_array = NSMutableArray()

    var data_array = NSMutableArray()

    var data_fet:[NSManagedObject] = []



    override func viewDidLoad()

    {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }

    override func viewWillAppear(_ animated: Bool)

    {

        let app = UIApplication.shared.delegate as! AppDelegate



        let context_view = app.persistentContainer.viewContext



        let fetch_data = NSFetchRequest<NSManagedObject>(entityName: "Student_detail")

        do

        {

//            



            data_array = try context_view.fetch(fetch_data as! NSFetchRequest<NSFetchRequestResult>) as! NSMutableArray

            print("this is array",data_array)

        }

        catch let error as NSError

        {

            print(error)

        }

        table_view.reloadData()

    }

    func numberOfSections(in tableView: UITableView) -> Int

    {

        return 1

    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

    {

        return data_array.count

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    {

        let t_cell = tableView.dequeueReusableCell(withIdentifier: "cell_data", for: indexPath) as! TableViewCell_data_view

        let result_data = data_array[indexPath.row]

        t_cell.t_std_name.text = (result_data as AnyObject).value(forKey: "stdName") as? String

        t_cell.t_roll_no.text = (result_data as AnyObject).value(forKey: "stdRoll") as? String

        t_cell.t_std_dept.text = (result_data as AnyObject).value(forKey: "stdDept") as? String

        t_cell.t_grade.text = (result_data as AnyObject).value(forKey: "stdGrade") as? String

        t_cell.t_img_view.image = UIImage(data: (result_data as AnyObject).value(forKey: "stdImage") as! Data)



        return t_cell

    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

    {

        performSegue(withIdentifier: "data_passing", sender: self)

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?)

    {

        if segue.identifier == "data_passing"

        {

            let view_c = segue.destination as! ViewController_Register

            let index_path = table_view.indexPathForSelectedRow





            let update_std_result = self.data_array[(index_path?.row)!]

            view_c.data_result = update_std_result as! NSManagedObject

        }

    }
import UIKit

import CoreData



class ViewController_Register: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate

{

    @IBOutlet var std_name: UITextField!

    @IBOutlet var std_roll: UITextField!

    @IBOutlet var std_dept: UITextField!

    @IBOutlet var std_grade: UITextField!

    @IBOutlet var std_image: UIImageView!



    var data_result:NSManagedObject!



    override func viewDidLoad()

    {

        super.viewDidLoad()

        // Do any additional setup after loading the view.

        std_image.isUserInteractionEnabled = true

        if data_result != nil

        {

            std_name.text = data_result.value(forKey: "stdName") as? String

            std_roll.text = data_result.value(forKey: "stdRoll") as? String

            std_dept.text = data_result.value(forKey: "stdDept") as? String

            std_grade.text = data_result.value(forKey: "stdGrade") as? String

            std_image.image = UIImage(data: data_result.value(forKey: "stdImage") as! Data)

        }

    }

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

    @IBAction func image_action(_ sender: UITapGestureRecognizer)

    {

        let img_pick = UIImagePickerController()

        img_pick.delegate = self

        img_pick.allowsEditing = true

        img_pick.sourceType = UIImagePickerControllerSourceType.photoLibrary

        self.present(img_pick, animated: true)

    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])

    {

        if let img_delegate = info[UIImagePickerControllerOriginalImage] as? UIImage

        {

            std_image.image = img_delegate

        }

        else

        {

            print("Error")

        }

        self.dismiss(animated: true, completion: nil)

    }



    @IBAction func register_action(_ sender: Any)

    {

        let app = UIApplication.shared.delegate as! AppDelegate



        let context_view = app.persistentContainer.viewContext



        if data_result != nil

        {

            data_result.setValue(std_name.text, forKey: "stdName")

            data_result.setValue(std_roll.text, forKey: "stdRoll")

            data_result.setValue(std_dept.text, forKey: "stdDept")

            data_result.setValue(std_grade.text, forKey: "stdGrade")

            let img_data = UIImageJPEGRepresentation(std_image.image!, 1.0)!

            data_result.setValue(img_data, forKey: "stdImage")

        }

        else

        {



        let student = NSEntityDescription.insertNewObject(forEntityName: "Student_detail", into: context_view) as NSManagedObject



        student.setValue(std_name.text, forKey: "stdName")

        student.setValue(std_roll.text, forKey: "stdRoll")

        student.setValue(std_dept.text, forKey: "stdDept")

        student.setValue(std_grade.text, forKey: "stdGrade")

        let img_data = UIImageJPEGRepresentation(std_image.image!, 1.0)!

        student.setValue(img_data, forKey: "stdImage")

        do

        {

            try context_view.save()

            print("name is-->",std_name.text!,"roll no is-->",std_roll.text!,"dept is -->",std_dept.text!)

        }

        catch let error as NSError

        {

            print(error.localizedDescription)

        }

    }

        self.navigationController?.popViewController(animated: true)



    }


}

最后,它通过使用下面的代码和父子上下文工作,比如在后台线程中创建private
managedObjectContext

func saveImageDetailsFromArray(dictionary : Dictionary<String, Any>,descriptiondictionary : Dictionary<String, Any>?, selectedImages: Array<PHAsset>, objectType: String, objectId: String, objectName:String,location: String?,completionHandler :@escaping PLMCoreDataCompletionHandler){

    let moc = self.managedObjectContext //Our primary context on the main queue
    let privateMOC = self.backgroundContext

    for phAsset in selectedImages{

        privateMOC?.perform {

            let index = selectedImages.index(of: phAsset)
            let   date  = HelpherMethod.sharedInstance().toLocalTime(Date())
            let timestamp = date?.timeIntervalSince1970
            print(String(format:"%f",timestamp!))
            let currentTimeStamp = String(format:"%f",timestamp!)
            var  imageName : String?
            imageName = String(format:"%@_%@",AuthService.instance.userName,currentTimeStamp)
            let  newImage = dictionary[phAsset.localIdentifier]
            let resource = PHAssetResource.assetResources(for: phAsset).first
            let fileName = resource?.originalFilename
            let userName = AuthService.instance.userName
            let mImage = NSEntityDescription.insertNewObject(forEntityName: "Image", into: privateMOC!) as! Image

            mImage.setValue(fileName, forKey: "fileName")
            mImage.setValue(date, forKey: "dateTime")
            mImage.setValue(objectId, forKey: "objectId")
            mImage.setValue(objectType, forKey: "objectType")
            mImage.setValue(objectName, forKey: "objectName")
            mImage.setValue(newImage, forKey: "image")
            mImage.setValue(imageName, forKey: "imageName")
            mImage.setValue(phAsset.localIdentifier, forKey: "imageUrl")
            mImage.setValue(userName, forKey: "userName")
            mImage.setValue("progress", forKey: "status")

            if let loc = location {
                mImage.setValue(loc, forKey: "location")
            }
            if let dict  = descriptiondictionary{
                if let description = dict[phAsset.localIdentifier] {
                    mImage.setValue(description, forKey: "comment")
                }
            }

            do {
                try privateMOC?.save()
                moc.performAndWait {
                    do {
                        try moc.save()
                        print("###########save context: \(String(describing: mImage))")
                        print("###########imageName: \(String(describing: imageName)))")

                        DispatchQueue.main.async {
                            if(index == selectedImages.count - 1){
                                print("###########index: \(String(describing: index)))")
                                completionHandler(true)
                            }
                        }
                    } catch {
                        fatalError("Failure to save context: \(error)")
                    }
                }
            } catch {
                fatalError("Failure to save context: \(error)")
            }
        }
    }
}
func saveImageDetailsFromArray(dictionary:dictionary,descriptiondictionary:dictionary?,selectedimage:Array,objectType:String,objectId:String,objectName:String,location:String?,completionHandler:@escaping PLMCoreDataCompletionHandler){
让moc=self.managedObjectContext//主队列上的主上下文
让privateMOC=self.backgroundContext
对于所选图像中的相位设置{
privateMOC?执行{
让index=selectedImages.index(of:phAsset)
让date=HelpherMethod.sharedInstance().toLocalTime(日期())
让时间戳=日期?时间间隔自1970年起
打印(字符串(格式:“%f”,时间戳!))
让currentTimeStamp=字符串(格式:“%f”,时间戳!)
var-imageName:String?
imageName=String(格式:“%@U%@”、AuthService.instance.userName、currentTimeStamp)
让newImage=dictionary[phAsset.localIdentifier]
让resource=PHAssetResource.assetResources(for:phAsset).first
让fileName=resource?.originalFilename
让userName=AuthService.instance.userName
让mImage=NSEntityDescription.insertNewObject(forEntityName:“Image”,into:privateMOC!)作为!Image
setValue(文件名,forKey:“文件名”)
mImage.setValue(日期,forKey:“日期时间”)
mImage.setValue(objectId,forKey:“objectId”)
setValue(objectType,forKey:“objectType”)
setValue(objectName,forKey:“objectName”)
mImage.setValue(newImage,forKey:“image”)
mImage.setValue(imageName,forKey:“imageName”)
mImage.setValue(phAsset.localIdentifier,forKey:“imageUrl”)
设置值(用户名,forKey:“用户名”)
mImage.setValue(“进度”,forKey:“状态”)
如果let loc=位置{
mImage.setValue(loc,forKey:“位置”)
}
如果让dict=描述dictionary{
如果let description=dict[phAsset.localIdentifier]{
mImage.setValue(描述,forKey:“注释”)
}
}
做{
试试privateMOC?.save()
商务部,等等{
做{
试试moc.save()
打印(“保存上下文:\(字符串(描述:mImage)))
打印(“