سؤال

لقد أدركت للتو أنه عندما تلاحظ movedTo حدث على بعض cursor, ، يتم تشغيل الحدث فقط للوثائق التي غيرت بالفعل نسبيا الموقف في المجموعة الناتجة ، لذلك ليس فهرس فقط. على سبيل المثال ، إذا كانت المجموعة الناتجة من المستندات تساوي أولاً [1, 2, 3], ثم يتغير إلى [3, 1, 2], ، سيتم تشغيل الحدث فقط للوثيقة الثالثة ، وليس كلهم. على الرغم من أنه يبدو معقولًا من وجهة نظر الكفاءة ، إلا أن الوثائق ليست واضحة على الإطلاق (انظر هنا):

انتقلت (المستند ، FromIndex ، Toindex ، من قبل)

غيرت مستند موقعه في مجموعة النتائج ، من fromIndex إلى toIndex(الذي هو قبل المستند مع معرف before). محتوياتها الحالية هي الوثيقة.

بالنسبة لي ، "تم تغيير موقعه في المجموعة الناتجة ، من الفهرس إلى الفهرس" يبدو أشبه بتغيير الثلاثة جميعهم ، لذلك في الواقع:

  • واحد يذهب من الفهرس 0 إلى مؤشر 1, ...
  • اثنان يذهب من الفهرس 1 إلى مؤشر 2, ، و ...
  • ثلاثة يذهب من الفهرس 2 إلى 0.

ما أريد تحقيقه هو مراقبة أ cursor ومعرفة ما إذا كان index من كل مستند يتغير أم لا. على الرغم من أن لديّ فكرة تقريبية عن كيفية تنفيذ هذا ، إلا أنني أتساءل عما إذا كانت هناك طريقة بسيطة (مثالية؟) و "صديقة للأنياب" لحل هذه المشكلة.

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

المحلول

هذا السلوك في الواقع منطقي تمامًا ليس فقط من وجهة نظر الأداء. فكر في الأمر بهذه الطريقة:

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

لا تريد أن يتم إخطارها 42 مرة عن حدث واحد!

 


 

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

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