أثناء تبديل العرض على شريط التنقل، كيفية إنهاء مؤشر ترابط NSOPSeriqueue بأمان بدون خطأ exc_bad_Access

StackOverflow https://stackoverflow.com/questions/2003445

  •  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];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top