منع إعادة الدخول مراقبة ValueForkeypath بشكل متكرر عندما أطلق KVO من Setter النموذج

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

سؤال

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

ومع ذلك ، في مكالمتي إلى خادم الويب ، يمكنني إعادة خطأ لأي شيء من الاتصال الذي يتم إسقاطه ، إعادة تعيين الخادم وما إلى ذلك إلى الخادم قائلاً إن التحديث لم يكن مسموحًا به (على سبيل المثال ، تم تغيير بعض المعلمات الأخرى بواسطة مستخدم آخر منع التحديث).

يا أفراح متجر بيانات منفصل ...

هل هناك أي طريقة يمكنني تحديثها self (أي النموذج) دون إعادة تشغيل عمل KVO؟

يمكنني إيقاف تشغيل المراقب عندما أحصل على الاستجابة ، لكن إجراء مستخدم آخر إلى نفس الكائن ممكن أثناء إجراء طلب خادم الخلفية. هذا من شأنه أن يكسر المكالمة الأخرى.

انظر المنشور هنا للحصول على شرح لما كنت أحاول القيام به للحصول على الملاحظة في المقام الأول ومثال رمز للنموذج الكامل.

سيكون الجزء الذي أقوم فيه بالمكالمة في المراقب على النحو التالي:

-(void)observeValueForKeyPath:(NSString *)keyPath
                 ofObject:(id)object
                   change:(NSDictionary *)change
                  context:(void *)context {

  if ([keyPath isEqual:@"firstName"]) {

    if !([serverCall value:[change objectForKey:NSKeyValueChangeNewKey] 
                    forKey:@"firstName"]) {

        // Notify the user of the problem and somehow do a 
        // [self setFirstName:[change objectForKey:NSKeyValueChangeOldKey]]
        // without firing off a KVO which would only loop this process
    }
  }

  if ([keyPath isEqual:@"lastName"]) {
    // Do whatever I need to do
  }
}

يبدو أن يا رفاق تتوصلون دائمًا إلى بعض النصائح الجيدة وأنا دائمًا ممتن لأي اقتراحات قد تكون لديكم.

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

المحلول

حسنًا ، انتهى بي الأمر بأخذ مسار مختلف. بدلاً من الاعتماد على نموذج الكائن لنشر التحديثات ، أخذت كل شيء على مستوى واحد وأدع وحدة التحكم تتعامل مع التحديثات.

كانت العملية في الأساس على النحو التالي:

  1. قم بإنشاء الكائنات في النموذج عند الحاجة
  2. احصل على جهاز التحكم في وحدة التحكم التي تم الاحتفاظ بها في طريقة متغير الحالة الحالية لإعدادات الكائن
  3. اجتاز الإعدادات الجديدة إلى الخادم ، ولكن فقط تلك التي تغيرت بين الإعدادات الحالية والإعدادات الجديدة (جميع قيم الدلتا)
  4. إذا تم تمرير المكالمة ، قم بتحديث النموذج أو ، إذا فشلت ، أبلغ المستخدم ولم يفعل شيئًا أكثر

لقد نجحت كونها رمزًا أكثر بقليل في كل وحدة تحكم ، ولكن من خلال مقارنة القيم الحالية ديناميكيًا بالقيم الجديدة ومرور فقط تلك التي تغيرت إلى الخادم الذي أنجزت نفس النتيجة الصافية.

يتيح لي ذلك تمرير واحدة من القيم الإضافية بناءً على عدد الأشخاص الذين تم تغييرهم دون الحاجة إلى مراسلة الرموز المتشددة والترميز مع استدعاء إلى طريقة خادم API مشتركة مرارًا وتكرارًا.

كان التأثير الصافي هو أنني أبقي كل إشعار KVC/KVO دون القلق بشأن تجاوزه أو عدم إجراء تحديثات KVC/KVO على بعض المكالمات وليس على الآخرين.

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