在Swift中同时保存CoreData时,应用程序崩溃

时间:2018-06-12 15:24:13

标签: swift core-data

在Core数据中保存时应用程序崩溃

df[['val1', 'val2', 'val3', 'val4']] = df[['val1', 'val2', 'val3', 'val4']].apply(lambda x: x/x.sum(), axis=1)


>>> df
  cat      val1      val2      val3      val4
0   A  0.194444  0.277778  0.000000  0.527778
1   B  0.370370  0.074074  0.037037  0.518519
2   C  0.119048  0.357143  0.142857  0.380952

我使用此代码

在后台将数据保存在Core数据中
do {
   try context.save()  <-----------  CRASH ---------
} catch {
   print("Failed saving")
}

根据上面的代码,可以同时保存在CoreData中 我做了一些任务来解决问题但是它们没有用。

首先:我想创建一个队列来处理并发保存

DispatchQueue.global(qos: .background).async {
        // Fetches from database                
        DispatchQueue.main.async {
             if fetchedActivitiesFromDB {
                 // Updates the view
             } else {
                 // gets from the server
                 // Save the result in Core Data <------------
                 let coreData = CoreDataHelper()
                 coreData.saveInDB(fetchedItemsFromServer)
             }
        }                 
} 

上述代码没有解决问题。

第二:CoreDataManager不是单例。我认为这是问题,所以我把它改成了:

let saveQueue = DispatchQueue(label: "start save in CoreData");
saveQueue.async {
        DispatchQueue.global(qos: .background).async{
           do {
              try context.save()
           } catch {
              print("Failed saving")
           }
        }
 }

第三次:我更改了CoreData堆栈设置

class CoreDataHelper {

    static let sharedInstance = CoreDataHelper()

    private init() {}

    static func getInstance() ->  CoreDataHelper {
        return sharedInstance
    }
    //...
}

ConcurrencyType曾经是 mainQueueConcurrencyType

这些变化都没有解决问题

崩溃详情:

static var managedObjectContext: NSManagedObjectContext = {
        let coordinator = persistentStoreCoordinator
        var managedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = coordinator

        return managedObjectContext
    }()

1 个答案:

答案 0 :(得分:0)

SocketHandler.mySocket.emitWithAck("my_event", [session, someInput]).timingOut(after: 3) {data in

       let myData = try? JSONDecoder().decode(myStruct.self, from: data)