菜鸟教程小白 发表于 2022-12-13 02:28:57

在 performBlock 中重置我的 NSManagedObjectContext 时,iOS 8 应用程序崩溃


                                            <p><p>当我的一个 NSManagedObjectContext 运行它的 <code>performBlock</code> 时,用户选择退出他们的帐户(这将重置所有上下文并删除持久存储)。这个重置代码显然是在与 performBlock 类似的时间运行的,因此应用程序崩溃并出现异常:</p>

<p><code>*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法从此 NSManagedObjectContext 的协调器访问对象的持久存储”</code></p>

<p>它崩溃的确切位置似乎是当一个上下文保存在其 <code>performBlock</code> 中时,然后它将发出 <code>did save</code> 通知,并合并到另一个上下文中.这是堆栈跟踪:</p>

<pre><code>0   CoreFoundation                      0x03b96df6 __exceptionPreprocess + 182

1   libobjc.A.dylib                     0x03820a97 objc_exception_throw + 44

2   CoreData                            0x034f7791 _PFRetainedObjectIDCore + 1169

3   CoreData                            0x034f72f0 - + 32

4   CoreData                            0x034db0f3 - + 595

5   CoreData                            0x0352e14e _faultBatchAtIndex + 1102

6   CoreData                            0x0352ed02 - + 50

7   CoreData                            0x035dd010 + + 144

8   CoreData                            0x035d7ba2 - + 738

9   CoreData                            0x035da3dd __77-_block_invoke + 2285

10CoreData                            0x034e7454 developerSubmittedBlockToNSManagedObjectContextPerform + 196

11CoreData                            0x034e7337 - + 231

12CoreData                            0x035d9acf - + 127

13Foundation                        0x00eff929 __57-_block_invoke + 40

14CoreFoundation                      0x03b61974 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20

15CoreFoundation                      0x03a4f61b _CFXNotificationPost + 3051

16Foundation                        0x00eeef26 - + 98

17CoreData                            0x034c84d3 - + 83

18CoreData                            0x034d9cbe - + 3934

19CoreData                            0x034d8d40 - + 496

20App                              0x00319707 __57-_block_invoke + 103
</code></pre>

<p>这仅适用于 iOS 8 - iOS 7 可以正常工作。我无法弄清楚这是否是我感受到影响的 iOS 8 的一个错误,或者 Apple 是否在 Core Data 中引入了破坏我们重置流程的“新功能”。任何人都可以对此有所了解吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我通过在 <code>NSManagedObjectContext</code> 上添加一个类别并使用 <code>objc_setAssociatedObject</code> 魔法添加一个标志来修复了这个错误。该标志用于确定上下文是否可以安全地执行任何出现的 performBlock。为此,我在名为 <code>safePerformBlock</code> 的类别上添加了另一个方法,该方法查看标志。如果为假,我立即返回,而不是处理传入的 block 。</p>

<p>当我删除上下文中的持久存储时,该标志设置为不安全。当用户随后重新登录并重新创建持久存储时,该标志将设置为安全。</p>

<p>本质上,我将上下文中的此标志视为 performBlocks 上的取消标记。我不知道为什么 API 中没有任何内容。在这种情况下,这是我能找到的最佳解决方案。</p></p>
                                   
                                                <p style="font-size: 20px;">关于在 performBlock 中重置我的 NSManagedObjectContext 时,iOS 8 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/26234523/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/26234523/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: 在 performBlock 中重置我的 NSManagedObjectContext 时,iOS 8 应用程序崩溃