ios - نادرة كوريداتا تحطم "نيلوترزرفيدكورنتيفنتسنافشوت"



xcode core-data (2)

تخمين البرية .. هل هناك أي فرصة لاستدعاء هذا الأسلوب حفظ من موضوع مختلف من الموضوع الفعلي الذي خلق السياق؟ لجانب أكثر أمانا، تنفيذ دائما حفظ: العملية من أداء / بيرفورمبلوكاندويت.

هناك حادث يحدث داخل بلدي التطبيق الذي يحدث فقط نادرا جدا (ربما مرة واحدة كل 30 أشواط). رمز الخطأ يحتوي على اسم محدد غريب _nilOutReservedCurrentEventSnapshot__ التي لم أتمكن من العثور على أي وثائق على الإطلاق. إليك الخلاصة من وحدة التحكم الخاصة بي:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType _nilOutReservedCurrentEventSnapshot__]: unrecognized selector sent to instance 0x157b51e0'
*** First throw call stack:
(0x2358810b 0x22d2ee17 0x2358d925 0x2358b559 0x234bbc08 0x24cbf445 0x24ca4d99 0x249bec 0x245c90 0x19b68c 0x24a5c97 0x24b05ab 0x24a8ef9 0x24b1a8d 0x24b18e7 0x232bfb29 0x232bf718)
libc++abi.dylib: terminating with uncaught exception of type NSException

إذا كان أي شخص قادر على تسليط بعض الضوء على معنى هذه العبارة _nilOutReservedCurrentEventSnapshot__`، من شأنه أن يساعدني كثيرا. لقطة شاشة لموقع الحادث أدناه:


للأسف ليس هناك الكثير يمكنك أن تجد حول _nilOutReservedCurrentEventSnapshot__ على الانترنت ..

من المحتمل أن تكون مرتبطة بدورة حياة اللقطة للكائن المدار.

عندما تجلب البيانات الأساسية كائن من مخزن مستمر، فإنه يأخذ لقطة من حالته. اللقطة عبارة عن قاموس للخصائص المستمرة للكائن، وعادة ما تكون جميع سماتها والمعرفات العمومية لأي كائنات لها علاقة واحدة. لقطات تشارك في تأمين متفائل. عندما يحفظ الإطار، يقارن القيم في كل لقطة كائن تم تحريره مع القيم المقابلة في الوقت الحالي في المخزن المستمر.

حقيقة أن _nilOutReservedCurrentEventSnapshot__ غير موثقة يعني أن هذا النوع من السلوك ليس من المفترض أن يحدث.

ما نعرفه هو أنها وظيفة من فئة NSManagedObject .

لذلك كان السبب الخطأ unrecognized selector sent to instance لأنه تم استدعاء _nilOutReservedCurrentEventSnapshot__ على كائن لم يكن NSManagedObject ، لأنه تم إلغاء تخصيص NSManagedObject شيء آخر الآن يملأ ذاكرتها. هذا واقع.

لا يعطى السياق من السؤال حول طبيعة التطبيق وإعداده كوريداتا ولكن يتم استدلال أنه يستخدم نمط التزامن بين الوالدين والطفل . هذا مهم.


[الصورة المستردة من هنا ]

من جميع الأسئلة التي طرحت على تجاوز كومة التي يمكن أن أجد حول هذا الخطأ، يبدو أنهم جميعا استخدام نمط التزامن بين الوالدين والطفل.

ومن الممكن تماما أن تكون القضية ناجمة عن اعتماد هذا النمط مع التنفيذ غير السليم أو التعامل مع ماناجيدوبجيكتس.

الحالة التي يمكن فيها استخدام سياق الوالدين والطفل عند مزامنة بيانات السحابة أو التعامل مع التغييرات التي يتم إجراؤها عندما يقوم المستخدم بتعديل شيء ما مع خيار التخلص من التغييرات التي تم إجراؤها أو التراجع عنها، والتي يمكن إجراؤها على مؤشر ترابط الخلفية.

ويذكر أيضا في السؤال أن هذا أمر نادر الحدوث ولا يحدث في كل مرة. وهذا يعني أن السياقات على الارجح على ما يرام حتى يتم حفظ معين أو تغيير وبطريقة ما تصبح سياقات من المزامنة، وأداء آخر حفظ تعطل التطبيق.

من المستندات في مزامنة التغييرات بين السياقات:

إذا كنت تستخدم أكثر من سياق كائن مدار في تطبيق ما، فإن "البيانات الأساسية" لا يخطر تلقائيا سياق واحد من التغييرات التي يتم إجراؤها على الكائنات في آخر. بشكل عام، وذلك لأن السياق يقصد به أن يكون لوحة خدش حيث يمكنك إجراء تغييرات على الكائنات في عزلة، ويمكنك تجاهل التغييرات دون التأثير على سياقات أخرى.

سيتم إرسال التغييرات إلى السياق الأصلي عند حفظ الطفل ولكن ليس إذا تم تغيير الأصل بشكل منفصل. فمن المستحسن بشدة أنك لا تغير السياق الأم. فقط من خلال حفظ سياق الطفل ونشر التغييرات من هناك.

السبب المحتمل لتحطم الطائرة



هناك العديد من الأشياء التي قد تسبب هذا ولكن اثنين أن التمسك هي:

1. ديالوكاتيون أوف ماناجيدوبجيكت من المرجع الذي يتم التخلص منه بسبب رفض عرض مشروط في تطبيق يوس أو ورقة في تطبيق أوسك.

الحل المحتمل: تعيين الخاصية retainsRegisteredObjects السياق الفرعي إلى ترو قبل جلب ماناجيدوبجيكتس (ثم تعيين إلى فالس مرة واحدة تم حفظ سياقات لتجنب المزيد من التسربات المحتملة الذاكرة). تحذير!

على سبيل المثال. ctx.retainsRegisteredObjects = true



2. التغييرات غير المعالجة في سياق.

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/ChangeManagement.html#//apple_ref/doc/uid/TP40001075-CH22-SW1

النظر في تطبيق مع اثنين من سياقات الكائن المدارة ومنسق مخزن ثابت واحد. إذا قام مستخدم بحذف كائن في السياق الأول (moc1)، قد تحتاج إلى إعلام السياق الثاني (moc2) أنه قد تم حذف كائن. في جميع الحالات، moc1 تلقائيا بإشعار نسماناجيدوبجيكتكونتيكستديدزافينوتيفيكاتيون عبر نسنوتيفيكاتيونسنتر أن التطبيق الخاص بك يجب تسجيل واستخدامها كمحرك لأي الإجراءات التي تحتاج إلى اتخاذ. يحتوي هذا الإشعار على معلومات ليس فقط حول الكائنات المحذوفة، ولكن أيضا حول الكائنات التي تم تغييرها. تحتاج إلى معالجة هذه التغييرات لأنها قد تكون نتيجة للحذف. معظم هذه الأنواع من التغييرات تتضمن علاقات عابرة أو خصائص مجدولة.

الحلول الممكنة هنا هي:

  • استخدم طرق الحظر في سياقاتك. الرجوع إلى وظيفة رد الاتصال في الجزء السفلي من الملف المرتبط.

  • تأكد من استخدام objectWithID عند تمرير حول ماناجيدوبجيكتس بين السياقات.

  • اتخاذ الإجراء المناسب على تغيير الكائن باستخدام NSManagedObjectContextDidSaveNotification الزناد.

  • إزالة جميع الإشارات القوية إلى ماناجيدوبجيكت. قد يكون من الممكن أن يكون هناك إشارة قوية إلى ماناجيدوبجيكت المستخدم خارج نطاق التعليمات البرمجية المعينة وهكذا عندما قام الوالد بإلغاء إدارة ماناجيدوبجيكت ولم يقم الطفل، في المستقبل حفظ أنجز الطفل آخر حفظ على أن ماناجيدوبجيكت و ثم حاول السياق الأم حفظ ماناجيدوبجيكت الذي تم إلغاء تخصيصه. "هو نمط جيد في محاولة لجلب الكائنات وتعديلها وحفظها وإعادة تعيين سياق [الطفل] تحرير"



لأنه لا يوجد أي معلومات أخرى هنا لاستنتاج ما هو سبب الخطأ، وأنا لا يمكن إعادة إنتاجه .. أود أن أقترح محاولة العثور على حيث يتم إلغاء ManagedObject باستخدام التنميط غيبوبة في الصكوك.

إذا تم إرسال رسالة ثم إلى واحدة من هذه الكائنات ديالوكاتد (التي هي الآن الكائنات نزومبي)، يتم وضع علامة على غيبوبة، تعطل التطبيق، توقف التسجيل، ويظهر مربع حوار غيبوبة مساج. يمكنك ثم فحص الاحتفاظ والإفراج عن تاريخ الكائن غيبوبة لتحديد بالضبط أين حدثت المشكلة.

https://github.com/iascchen/SwiftCoreDataSimpleDemo/blob/master/SwiftCoreDataSimpleDemo/CoreDataHelper.swift

نأمل بعد ذلك شخص يمكن تسليط المزيد من الضوء على ما تسبب في هذه القضية.



+++++++++++++++++++++++++++++++++

ملاحظة جانبية:
السياقات الأصل / الطفل يمكن أن يؤدي إلى التأتأة من واجهة المستخدم - "كل طلب جلب وكل عملية حفظ سوف تمنع بشكل كامل الموضوع الرئيسي أثناء قراءة البيانات أو كتابة إلى / من القرص". وذلك لأن كل الجلب يتم سحبها من خلال سياق الأصل (على مؤشر الترابط الرئيسي) للطفل.

دعم سو الجواب

فمن المستحسن أن إذا كنت تستخدم هذا النهج الذي كنت إعادة النظر في تصميم لشيء مثل اثنين من سياقات كائن المدارة المدارة متصلة بنفس منسق مخزن المستمر والتي قد "تجنب" القضية في متناول اليد في المستقبل من الحدوث.

[الصورة المستردة من هنا ]

يمكنك أن ترى الاختلافات في الأداء جذرية في المادة المرتبطة





swift2