أثناء تبديل العرض على شريط التنقل، كيفية إنهاء مؤشر ترابط NSOPSeriqueue بأمان بدون خطأ exc_bad_Access
-
18-09-2019 - |
سؤال
أنا أستخدم JitalView لإظهار بعض رسائل السلسلة، واستخدم NSOPSeriqueue لعقد NSoperation مخصص الذي يجلب الرسالة في مؤشر ترابط الخلفية. بعد رسالة واحدة جلبت بنجاح، سيقوم NSoperation حسب الطلب بإعلام وحدة تحكم ApimalView لإظهارها.
إذا قمت بالنقر فوق الزر "السابق" على شريط التنقل للتبديل من JitalView إلى طريقة عرض أخرى بعد تحميل الرسالة، كل شيء على ما يرام. ولكن، إذا قمت بالنقر فوق الزر "السابق" بينما لا تزال بعض الرسائل تحميل، فإن exc_bad_access هو رمي. لقد راجعت أن الاستثناء حدث أثناء إخطار NSOPTION مخصص وحدة تحكم performSelectorOnMainThread
طريقة. يبدو وكأنه وحدة تحكم AtimentView الهدف غير صالح بعد العرض، لكنني أعتقد أن وحدة تحكم التنقل ستحتفظ بمثيل عرض العرض. هل لي أن أعرف كيفية حل هذه المشكلة؟ شكرا.
تتم تهيئة عملية مخصصة في وحدة تحكم JitalView مع التعليمات البرمجية التالية:
StatusMessageLoadingOperation *operation = [[StatusMessageLoadingOperation alloc]
initWithData:person
messageArray:cachedStatusMessages
target:self
action:@selector(didFinishStatusMessages:)];
[operationQueue addOperation:operation];
[operation release];
سيتم تحديث فئة Nxoperation مخصصة OtherView مع التعليمات البرمجية التالية:
- (void)main{
for (int i = 0; i < [[person statusMessages] count]; i++) {
[target performSelectorOnMainThread:action withObject:messageArray waitUntilDone:NO];
}
}
المحلول
هل حاولت الاتصال [operationQueue cancelAllOperations]
في الخاص بك viewWillDisappear
طريقة؟
نصائح أخرى
لأن ظهرت تحكم عرض مكالمات تحكم -dealloc
الطريقة، قد تقوم بإصدار قائمة انتظارك مبكرة للغاية، وبعضها البعض من طلبك يحاول الوصول إلى قائمة الانتظار أو عملية داخلها لم تعد موجودة.
توصيتي هي وضع الخاص بك NSOperationQueue *myQueue
مثيل مندوب طلبك.
استخدم مندوب التطبيق -applicationDidFinishLaunching:
و -dealloc
طرق لتهيئة وإطلاق قائمة الانتظار الخاصة بك ومحتوياتها.
عن طريق فصل قائمة الانتظار الخاصة بك من وحدة تحكم العرض، لن يتم إصدار قائمة انتظارك عند إيقاف تشغيل وحدة تحكم عرض من مكدس التنقل الخاص بك. ومع ذلك، يجب أن تكون أي عمليات متبقية متاحة لبقية التطبيق.
لتسهيل الوصول إلى قائمة انتظارك، قم بإعداد تعريف الماكرو التالي:
#define UIAppDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate)
يمكنك بعد ذلك استخدام الماكرو للوصول إلى قائمة انتظارك على النحو التالي، على سبيل المثال:
NSLog(@"%@", [[UIAppDelegate myQueue] operations]);
أو، على سبيل المثال:
[[UIAppDelegate myQueue] addOperation:myOperation];