Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 核心数据多线程问题_Swift_Multithreading_Core Data - Fatal编程技术网

Swift 核心数据多线程问题

Swift 核心数据多线程问题,swift,multithreading,core-data,Swift,Multithreading,Core Data,我已经在多线程环境中实现了核心数据,对此我有一些疑问和问题,我将在下面列出:- 一些博客和答案都说应该有一个NSPersistentStoreCoordinator(PSC),但根据我的理解,“PSC”应该等于ManagedObjectModel的数量。如果我错了,请纠正我 根据doc,ManagedObjectContext对象应该等于我们为在特定模型中执行活动而创建的线程数。令我惊讶的是,我使用了来自不同线程的单个ManagedObjectContext对象,并在没有任何崩溃的情况下同时执

我已经在多线程环境中实现了核心数据,对此我有一些疑问和问题,我将在下面列出:-

  • 一些博客和答案都说应该有一个
    NSPersistentStoreCoordinator
    (PSC),但根据我的理解,“PSC”应该等于ManagedObjectModel的数量。如果我错了,请纠正我

  • 根据doc,ManagedObjectContext对象应该等于我们为在特定模型中执行活动而创建的线程数。令我惊讶的是,我使用了来自不同线程的单个ManagedObjectContext对象,并在没有任何崩溃的情况下同时执行抓取操作,请查找以下代码:-

    我从不同的线程调用下面的函数,并确保只创建一个MOC实例。请澄清我所有的疑问

  • func fetchUserDetail(productId:Int)->用户详细信息?{
    let fetchRequest=NSFetchRequest(entityName:“用户详细信息”)
    做{
    fetchRequest.predicate=NSPredicate(格式:“产品id==%d”,产品id)
    let results:[User_Details]?=try(singleinstancemanagedObjectContext.fetch(fetchRequest)作为?[User_Details])
    如果让结果=结果{
    ……逻辑。。。。。
    }
    }将let错误捕获为NSError{
    }
    归零
    }
    
  • “NSPersistentStoreCoordinator”只能处理一个NSManagedObjectModel。你就在这里。但拥有多个“NSPersistentStoreCoordinator”需要多个“NSManagedObjectModel”(.xcdatamodeld文件)。这种情况非常罕见

  • 并发崩溃本质上是难以捉摸的。只有当多个线程以纳秒精度同时访问同一数据时,才会发生这种情况。当100多个用户使用该应用程序时,通常会在生产过程中出现这些难以调试的错误。您最不想对用户说的是,我们已经丢失了您的所有数据(已损坏或崩溃)。所以你最好听一下这里的文档。我们犯了同样的错误,在一个旧应用程序的不同线程之间传递NSManagedObject,并为此付出了代价。重构代码花了很长时间。最后从核心数据编程指南

  • NSPrivateQueueConcurrencyType配置创建自己的队列 初始化时,只能在该队列上使用。因为 队列是私有的,在NSManagedObjectContext实例内部, 只能通过performBlock:和 performBlockAndWait:方法

    这是同一页的另一个

    NSManagedObject实例不打算在 排队。这样做可能导致数据损坏和终止 应用程序的名称。需要移交托管对象时 从一个队列到另一个队列的引用,必须通过 NSManagedObjectID实例


    如果我们使用不同的线程访问模型,那么最好的做法是每次创建一个NSManagedObjectContext,或者创建一个NSManagedObjectContext,然后使用NSPrivateQueueConcurrencyType处理并发。