ما هي المهام الأكثر ملاءمة لـ nsoperation من GCD؟ [مكرر
-
30-09-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
ما هي المهام التي ستكون أكثر ملاءمة للاستخدام NSOperation
على عكس الاستخدام GCD
متى البرمجة لجهاز iPhone؟
بالنسبة لي يبدو أنهم يفعلون نفس الشيء. لا أستطيع أن أرى نقاط القوة والضعف لدى المرء على الآخر.
المحلول
NSOperation
تم تصميمه على قمة GCD ، وبالتالي فإن السؤال هو أكثر ما إذا كنت تستخدم NSOperation
أو تمرير كتلة مباشرة إلى GCD.
و NSOperation
ضخم ويحتاج إلى المزيد من رموز لوحة الغلاية لإعدادها ، ولكن لديها الكثير من الوظائف. يمكنك إنشاء نفس الشيء NSOperation
الفئة الفرعية في أجزاء مختلفة من الكود الخاص بك ووضعها في قائمة الانتظار وقم بتشغيلها.
تمرير كتلة إلى GCD بواسطة EG dispatch_async
سريع ويمكن التخلص منه. عادة لا تعيد استخدام كتلة في أي مكان آخر ؛ لقد قمت للتو بإعداد كتلة يتم تنفيذها فقط عند تلك النقطة من الكود ، وتنقلها إلى GCD أو واجهات برمجة التطبيقات الأخرى ، وتستمر بسرعة.
لذلك كل لديه مزاياه.
نصائح أخرى
على ما يبدو ، تم بناء nsoperationqueue على GCD اعتبارًا من iOS 4 ؛ لم يتم تحديث المستندات. تحقق من هذا النشر من قبل موظف Apple هنا: https://devforums.apple.com/message/352770 (قد تحتاج إلى إنشاء حساب) لذا ، يجب عليك اتباع نصيحة مايك عبد الله واستخدام أبسط واجهة برمجة التطبيقات للمهمة المطروحة. Dispatch_async هو المستوى الأدنى ، وعادة ما تكون الأشياء من النوع C (على سبيل المثال لا الحصر) ، وهي جيدة لصفقات نوع واحد ونوع متسلسل (النار هذه الكتلة في قائمة الانتظار هذه ، FTW). NSOPerationQueues هي مستوى أعلى ، والمواد الهدف ، وهي جيدة إذا كنت تضيف الكثير من العمليات في نقاط مختلفة في الكود الخاص بك ، و/أو تحتاج إلى إدارة التزامن وأولويات وتبعيات. على الأقل هذه هي الطريقة التي أستخدم بها.
كما هو الحال دائمًا مع مثل هذه الأسئلة ، استخدم أبسط واجهة برمجة التطبيقات المتاحة. قياس إذا كانت مشكلة في الأداء ثم إعادة تقييم إذا لزم الأمر.
شيء واحد لا أعتقد أنه تم ذكره هنا هو ذلك NSOperation
يمكن إلغاء S أثناء التنفيذ ، في حين أن الكتلة مضمونة لإكمالها بمجرد بدء التنفيذ. بعد قولي هذا ، يمكن تعليق قائمة انتظار GCD (dispatch_suspend()
) ، بحيث لن يتم تنفيذ أي كتل بعد الكتل المنفذة حاليًا.