عدم إرسال NSNOTINGER
-
22-09-2019 - |
سؤال
أحاول الحصول على مثيل واحد لاستخدامه NSNotificationCenter
مع addObserver
و postNotificationName
لكن لا يمكنني معرفة سبب عدم عمله.
لدي سطرين إلى رمز لإضافة المراقب وإرسال الرسالة في فئتين مختلفتين
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(newEventLoaded:) name:@"Event" object:nil];
و
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
إذا قمت بتعيين الاسم على nil
إنه يعمل بشكل جيد لأنه مجرد بث ، عندما أحاول تحديد اسم إشعار لا تمر به الرسائل أبدًا.
المحلول
كل رمز الخاص بي يستخدم NSNotifications
مثل ذلك:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil];
الأول هو تسجيل الإخطار والنشر الثاني للإشعار.
نصائح أخرى
في الأساس ، كل ما يتعلق بترتيب التنفيذ. إذا قمت بتنفيذ postNotificationName قبل AddObserver ، فهذه مشكلة سهلة. استخدم نقاط التوقف والخطوة من خلال الرمز :)
يجب أن تتوقف نقطة التوقف الأولى هنا:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"ScanCompleted" object:nil];
ثم هنا:
[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self];
أيضا ، تأكد من أن المحدد لديه القولون. لأنه توقيع الأسلوب سيكون:
- (void)updateView:(NSNotification *)notification;
كان لي نفس المشكلة. والسبب هو أنني اتصلت بـ RemoveObserver Method في
- (void)viewDidDisappear:(BOOL)animated{
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter removeObserver:self];
}
لذا تحقق مما إذا كنت قد اتصلت بـ RemoveObserver قبل التحويل.
نصائح: يمكنك البحث في الكلمة الرئيسية "removeObserver" للعثور على ما إذا كنت قد استدعت هذه الوظيفة.
غير هذا:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
الى هذا:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil];
إذا تم تسجيل إخطارك الأول بشكل صحيح ، فيجب استدعاء NewEventloaded.
واجهت مشكلة مماثلة وكانت مشكلتي بسبب الإخطار الذي يتم استدعاؤه في موضوع آخر. هذا حل مشكلتي.
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
});
هل جربت أي أسماء أخرى ولكن @"حدث" و NIL؟ فقط للتأكد ، يمكنك تحديد أسماء الأحداث الخاصة بك في ملف واحد وتضمين ذلك في كل من تسجيل الإخطار وإرساله. علي سبيل المثال:
الملف الاساسي:
extern NSString * const NOTE_myEventName;
مصدر الملف:
NSString * const NOTE_myEventName = @"MyEventName";
تسجيل:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleMyEvent:)
name:NOTE_myEventName
object:nil];
إرسال الإخطار:
[[NSNotificationCenter defaultCenter]
postNotificationName:NOTE_myEventName object:nil];
لقد أصلحت بنجاح "NSNotification
لا يتم إرسالها عندما postNotificationName:
يسمى "تحطم.
لقد وجدت أن الخطأ الحقيقي في معالج رسائل الإخطار.
ال postNotificationName
و addObserver
كلها على صواب مثل أول وظيفة من هذا الموضوع.