سؤال

لدي سؤال حول تجاوز أساليب الملحقات التي تم إنشاؤها تلقائيًا. ما يلي لن يعمل (على ما أظن) لأن كل getter يشير إلى getter الآخر. هل هناك قاعدة لا ينبغي أن تستخدم أساليب الملحقات أساليب ملحق أخرى ، أو هل عليك فقط الانتباه إلى هذه المواقف بشكل فردي؟

-(UIImage *) image{

    if(image == nil){
        if(self.data == nil){
            [self performSelectorInBackground: @selector(loadImage) withObject: nil]
        }else{
            self.image = [UIImage imageWithData: self.data];
        }
    }

    return image;
}

-(NSData *) data {

    if(data == nil){
        if(self.image == nil){
            [self performSelectorInBackground: @selector(loadData) withObject: nil]
        }else{
            self.data = UIImageJPEGRepresentation(self.image, 0.85);
        }
    }

    return data;
}

يجب أن أؤكد أن استخدام الصورة المقدم هنا هو مثال ، والأفكار المتعلقة بما يجب القيام به في هذا المثال بالذات أقل أهمية من الحالة العامة.

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

المحلول

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

لا توجد قاعدة حول الملحقات (على الأقل لا أعرفها) ، لأن الناس لا يقومون بالكثير من التحميل كسول في الوصول. في بعض الأحيان أحصل على نفسي من خلال حلقة لا نهاية لها بسبب كسول [UIViewController loadView] بالاشتراك مع [UIViewController view], ، ولكن ذلك حول هذا الموضوع.

نصائح أخرى

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

ما تفعله بالفعل في هذا المثال قد يستغرق وقتًا طويلاً للتحميل ؛ من الأفضل التأكد من أنه آمن.

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

على وجه التحديد ، قد ترغب في استدعاء بيانات/صورة تحميل من المزود ، واتصل بها من Awakefromnib (على سبيل المثال) - ثم يتم تشغيل المحمل ويقوم بتحميل البيانات على مؤشر ترابط ثانوي (esp. إذا تم تنزيله). امنح مزود البيانات رد اتصال لإبلاغ العرض بأن الصورة جاهزة (عادةً ما تستخدم البروتوكولات). بمجرد التقاط العرض ، قم بإبطال مزود البيانات.

أخيرًا ، إذا كنت تتعامل مع موارد التطبيق ، فسيقوم "النظام" بتخزين بعض هذا من أجلك Sooo الذي ستحاول العمل ضد ما تم تحسينه بالفعل وراء الكواليس.

باختصار ، عادة ما يكون الأمر جيدًا (على سبيل المثال لا تهيئة كسول) - ولكن هذا التصميم المحدد (كما قال ملصق آخر) له تبعية دائرية يجب تقليلها.

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