Swift 应用程序在保存核心数据时挂起

Swift 应用程序在保存核心数据时挂起,swift,core-data,Swift,Core Data,我正在使用swift core数据在应用程序中保存用户信息,但在保存当前用户数据(姓名、简历、3-4张照片)时,它会挂起2-3秒,直到保存数据为止。避免应用程序挂起的最佳方法是什么?这是我正在使用的代码 for photo in photos { let data = NSData(contentsOfURL: NSURL(string: photo.url!)!) let newimg = UIImage(data: data!)

我正在使用swift core数据在应用程序中保存用户信息,但在保存当前用户数据(姓名、简历、3-4张照片)时,它会挂起2-3秒,直到保存数据为止。避免应用程序挂起的最佳方法是什么?这是我正在使用的代码

       for photo in photos {
            let data = NSData(contentsOfURL: NSURL(string: photo.url!)!)
            let newimg = UIImage(data: data!)
            newusersImages.addObject(newimg!)
        }

        mayBeUser.name = currentuser!.objectForKey("name") as! String
        let arrayData = NSKeyedArchiver.archivedDataWithRootObject(newusersImages)
        let locationData = NSKeyedArchiver.archivedDataWithRootObject(currentuser!.objectForKey("location")!)


        mayBeUser.photos = arrayData
        mayBeUser.location = locationData
        mayBeUser.about = currentuser!.objectForKey("about") as! String
        mayBeUser.setValue(currentuser!.objectForKey("age") as! Int, forKey: "age")
        mayBeUser.objectId = currentuser!.objectId!
        mayBeUser.lastSeen = currentuser!.objectForKey("lastSeen") as! NSDate

        try! context.save()
        print("Current User Updated")

当用户有10-15个朋友时,需要挂起一分钟来保存/更新用户的所有信息/数据。

以下是我的做法。现在,显然您不希望UI挂起,因此您需要使用具有私有队列并发类型的托管对象上下文。更多信息。具体来说,请看结尾部分,他详细介绍了如何创建导出函数


现在,由于在本例中您正在将数据保存到持久性存储中,您可能不希望用户在保存以前的更改时四处更改内容,在本例中,您可能需要一个显示保存进度的临时屏幕

我会这样做的。现在,显然您不希望UI挂起,因此您需要使用具有私有队列并发类型的托管对象上下文。更多信息。具体来说,请看结尾部分,他详细介绍了如何创建导出函数

现在,由于在本例中您正在将数据保存到持久性存储中,您可能不希望用户在保存以前的更改时四处更改内容,在本例中,您可能需要一个显示保存进度的临时屏幕

您(和您的应用程序)必须努力将所有照片数据保存到您的
用户
实体的一个属性中。相反,请重新构建数据模型:

  • 为照片创建一个单独的
    Photo
    实体
  • 不要将照片图像数据存储在CoreData中,只需存储带有URL的字符串即可
  • 添加从
    用户
    照片
    的多对多关系,而不是
    照片
    属性
  • 顺便说一句,我会避免使用
    objectId
    作为属性名称:它与CoreData的
    objectId
    非常接近,这会造成混淆。

    您(和您的应用程序)必须努力将所有照片数据保存到
    用户的
    实体的一个属性中。相反,请重新构建数据模型:

  • 为照片创建一个单独的
    Photo
    实体
  • 不要将照片图像数据存储在CoreData中,只需存储带有URL的字符串即可
  • 添加从
    用户
    照片
    的多对多关系,而不是
    照片
    属性

  • 顺便说一句,我会避免使用
    objectId
    作为属性名称:它与CoreData的
    objectId
    非常接近,这会造成混淆。

    可以这样做,但我不希望用户等待一分钟。这就是我想做的。是的,这是可以做到的,但我不希望用户等待一分钟。这正是我想做的。实际上,这没有多大帮助,我应该改为使用sqlite吗?@user528432如果还需要2-3秒,我怀疑问题出在CoreData保存中。您是否尝试过在instruments中评测以查看需要花费的时间?实际上,这没有多大帮助,我是否应该改为使用sqlite?@user528432如果仍然需要2-3秒,我怀疑问题是否出在CoreData保存中。你有没有试过用仪器来分析,看看是什么花了时间?