ما هي أفضل الممارسات لعملية طويلة الأمد تعمل على تحديث البيانات في عرض طاولة iPhone المعروض حاليًا؟

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

سؤال

خلفية:

لدي عرض جدول يعرض حوالي 8 أقسام مدعومة بفئة PlaceList الخاصة بي والتي تمثل قائمة من الكائنات (يستخدم التنفيذ NSMutableArray).هناك حوالي 200 كائن في المجموع.يتوافق كل قسم مع مدى بعد الكائن عن الموقع الحالي (على سبيل المثال.في حدود ميل واحد، في حدود 10، 25، 50...الخ).

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

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

سؤال:

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

  • هل يقوم UI وCoreLocation locationManager بإرسال إشعاراتهما على نفس الموضوع، على سبيل المثال.هل يمكنني الاستغناء عن @synchronized(self) بأمان في قائمة الأماكن؟

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

المحلول

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

إذا كان هذا صحيحًا، فإليك بعض الخيارات.

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

يؤدي هذا إلى تجنب مشكلة الترابط إلى حد كبير نظرًا لأن الإشعارات لا تقوم بتعديل البيانات وتحاول إظهارها في نفس الوقت.

AFAIK، يبدو أن تطبيق Facebook يفعل ذلك، وكذلك TwitterFon.على الأقل هذا ما تشعر به.من الصعب القول على وجه اليقين.

2) شاشة التحميل!ليست ممتعة، ولكنها تعمل.عندما تعلم أن البيانات سيئة، قم بإنشاء لوحة شبه شفافة واطلب من المستخدم الانتظار قليلاً.

يتلخص الأمر حقًا في التحديث الآن أو لاحقًا.عليك أن تقرر ما هي المقايضات الأكثر منطقية في طلبك.

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