سؤال

هذا ليس سؤالًا مثل تحذير للآخرين لإنقاذهم بعض الوقت.

NSNotificationCenter على iOS 3/iPhone OS 3 (أفترض أيضًا أن Mac OS X و IOS 4) لديه السلوك التالي:

إذا قمت بتسجيل نفسك عدة مرات للحصول على الإخطار المحدد الدقيق ، فسوف NSNOtificationCenter ليس تعرف على التكرار وسيقوم بدلاً من ذلك بإطلاق العديد من الإخطارات لك كما قمت بتسجيل ملاحظة.

هذا لا يكاد يكون السلوك الذي تريد رؤيته وهو دائمًا ما يكون عرضيًا تقريبًا.

مثال:

أريد أن تتلقى وحدة تحكم العرض الخاصة بي إشعارات من كائن شبكة Singleton عندما تأتي بيانات جديدة:

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

لكن في وقت سابق كنت أضع نفس الشيء بالفعل في viewWillAppear:

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

لاحظ أنه بالضبط نفس الإخطار ، حل على نفس المراقب والمرسل واسم الإخطار.

في هذه الحالة ، إذا لم أزيل إحدى مكالمات AddObserver هذه ، فسوف أحصل على إشعارات مكررة إلى وحدة التحكم في العرض الخاصة بي.

في بيئة متعددة الخيوط ، هذا عالم من الأذى. صدقني.

مجرد وضع هذا هناك في حالة وجود الآخرين الذين واجهوا شيئًا كهذا.

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

المحلول

NSNotificationCenter على iOS 3/iPhone OS 3 (أفترض أيضًا أن Mac OS X و IOS 4) لديه السلوك التالي:

إذا قمت بتسجيل نفسك عدة مرات للحصول على الإخطار المحدد الدقيق ، فسوف NSNOtificationCenter ليس تعرف على التكرار وسيقوم بدلاً من ذلك بإطلاق العديد من الإخطارات لك كما قمت بتسجيل ملاحظة.

هذا لا يكاد يكون السلوك الذي تريد رؤيته وهو دائمًا ما يكون عرضيًا تقريبًا.

مثال:

أريد أن تتلقى وحدة تحكم العرض الخاصة بي إشعارات من كائن شبكة Singleton عندما تأتي بيانات جديدة:

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

لكن في وقت سابق كنت أضع نفس الشيء بالفعل في viewWillAppear:

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

لاحظ أنه بالضبط نفس الإخطار ، حل على نفس المراقب والمرسل واسم الإخطار.

في هذه الحالة ، إذا لم أزيل إحدى مكالمات AddObserver هذه ، فسوف أحصل على إشعارات مكررة إلى وحدة التحكم في العرض الخاصة بي.

في بيئة متعددة الخيوط ، هذا عالم من الأذى. صدقني.

مجرد وضع هذا هناك في حالة وجود الآخرين الذين واجهوا شيئًا كهذا.

نصائح أخرى

يجب عليك دائمًا تنظيف مراقبيك.
أسهل طريقة للقيام بذلك هي: [[nsnotificationcenter defaultCenter] removeObserver: Self
لا يعد ViewDidload مكانًا جيدًا لإضافة مراقبين ، لأن هذه الوظائف قد يتم استدعاؤها عدة مرات ، يحدث هذا عند تشغيل ViewDidunload. مكان جيد لوضع addobservers الخاص بك في ViewWillAppear ، و removeObservers في ViewWillDisAppear.

كما قلت نفسك ، لا يقوم nsnotificalcenter بالتحقق من التكرارات ، والتي قد تكون مزعجة بالنسبة للبعض ، ولكنها منطقية عند إدخال النظام الكامل وراءه.

ينطبق نفس المنطق على إضافة أهداف إلى كائنات معينة ، ولكن غالبًا ما يكون هناك اعتراف رئيسي على تلك.

شكرا لك على البصيرة ، وللتحذير جيد وصديق لكبار المسئولين الاقتصاديين :)

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