إلغاء قائمة الانتظار performSelector: المكالمات afterDelay

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

  •  05-07-2019
  •  | 
  •  

سؤال

لا أحد يعرف إذا كان من الممكن لإلغاء الأحداث محدد في قائمة الانتظار بالفعل من المكدس الحدث أو كومة الموقت (أو ما آلية ذلك هو أن يستخدم من قبل API) عند استدعاء performSelector:withObject:afterDelay؟

وكنت تستخدم هذا المكدس الحدث لتغيير سمات صورة ضمن علامة التبويب TabBar، وسوف قائمة الانتظار تصل أحيانا إلى 10 ثانية بقيمة التغييرات في واحدة تنفيذها بسرعة لحلقة ... ربما 5 ميلي ثانية أو نحو ذلك.

والمشكلة تنشأ إذا تبديل المستخدم علامات التبويب ... مثل القول لدي التعديلات صورة قائمة الانتظار للصورة التي يتم عرضها في أقرب وقت تبويب يتم تمكين رقم 4، ثم للمستخدم التبديل بسرعة إلى تبويب رقم 3 ثم انقر بزر الماوس العودة إلى تبويب رقم 4 ... وهذا من شأنه ثم إعادة قائمة الانتظار 10 ثانية أخرى بقيمة التعديلات بينما قائمة انتظار القديم كان لا يزال يلعب، ربما حوالي 2 أو 3 ثوان في لقائمة الانتظار إذا تحول سريع بما فيه الكفاية ... ولكن حتى تصل إلى 5 وكانت ثانية في لتيار مشكلة.

ولذا فإنني في حاجة الى بعض طريقة لإلغاء كومة القديم من التغييرات قبل وضع كومة جديد على ...

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

هل كانت مفيدة؟

المحلول

[NSObject cancelPreviousPerformRequestsWithTarget:]

أو

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

ووtarget هو الكائن الأصلي الذي كان يسمى performSelector:afterDelay:.

وعلى سبيل المثال:

// schedule the selector
[self performSelector:@selector(mySel:) withObject:nil afterDelay:5.0];
// cancel the above call (and any others on self)
[NSObject cancelPreviousPerformRequestsWithTarget:self];

وانظر <لأ href = "http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject / performSelector: withObject: afterDelay: "يختلط =" noreferrer "> مستندات التفاح ، انها حق في نهاية الوصف performSelector:withObject:afterDelay:

نصائح أخرى

في أجل إلغاء كافة تنفيذ طلبات السابقة، يمكنك استخدام:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   

إذا كنت تبحث عن "performSelector" أن يكون لها مطابقة "cancelPreviousPerformSelector" ... لا. (هتاف اشمئزاز، وأبل، لماذا تفعل ذلك بالنسبة لي؟)

وو، إيه، آه، وأساليب "مطابقة" هي:

performSelector

cancelPreviousPerformRequestsWithTarget

و(فقط لتجعل من الصعب اضافية لنتذكر، دون البحث المستندات).

والتحقق من مستندات NSRunLoop. تريد -cancelPerformSelectorsWithTarget:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top