ما هو أفضل أسلوب للتخزين المؤقت للصور غير المتزامنة على iPhone؟

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

سؤال

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

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

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

  • بحث غير متزامن:لذا فكرت في البحث عنها بكميات كبيرة، ولكن بشكل غير متزامن، باستخدام NSInvocationOperation.بالنسبة لكل صورة يتم العثور عليها في AddressBook، سأقوم بحفظ صورة مصغرة في وضع الحماية الخاص بالتطبيق.بعد ذلك، يمكن لكل خلية الإشارة إلى هذا الملف وإظهار الملف الافتراضي إذا لم يكن موجودًا (لأنه ليس موجودًا في الكتاب أو لم يتم العثور عليه بعد).إذا تم العثور على الصورة لاحقًا في البحث غير المتزامن، فستظهر فجأة في المرة التالية التي يلزم فيها عرض الصورة.قد يعمل هذا بشكل جيد للتجديد الدوري للصور (عندما يتم تغيير الصور في دفتر العناوين، على سبيل المثال).ولكن بالنسبة لأي مثيل لتطبيقي، قد لا تظهر الصورة فعليًا لفترة من الوقت.

  • بحث خلية الجدول غير المتزامن:من الناحية المثالية، سأستخدم شيئًا مثل تحديث خلية الجدول غير المتزامن لـ markjnet لتحديث خلايا الجدول بصورة بمجرد تنزيلها.ولكن لكي ينجح هذا، يجب أن أقوم بفصل NSInvocationOperation مهمة لكل خلية كما يتم عرضها وإذا كان الرمز المخزن مؤقتًا مفقودًا من وضع الحماية.ولكننا نعود بعد ذلك إلى التكرار غير الفعال عبر دفتر العناوين بأكمله لكل واحد - ويمكن أن يكون هناك الكثير منها إذا كنت قد قمت للتو بتنزيل مجموعة كاملة من عناوين البريد الإلكتروني الجديدة.

لذلك سؤالي هو:كيف يفعل الآخرون هذا؟كنت أعبث مع Tweetie2، ويبدو أنه يقوم بتحديث خلايا الجدول المعروضة بشكل غير متزامن.أفترض أنه يرسل طلب HTTP منفصلاً لكل صورة يحتاجها.إذا كان الأمر كذلك، فأنا أتصور أن البحث في دفتر العناوين المحلي عن طريق عنوان البريد الإلكتروني ليس أقل كفاءة، لذا ربما يكون هذا هو الأسلوب الأفضل؟ألا تقلق بشأن مشكلات الأداء المرتبطة بالبحث في دفتر العناوين؟

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

كيف يمكن لبقيتكم حل هذا النوع من المشاكل؟الاقتراحات ستكون محل تقدير كبير!

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

المحلول

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

قم بإنشاء NSMutableDictionary والذي سيكون بمثابة ذاكرة التخزين المؤقت في الذاكرة لنتائج البحث.قم بتهيئة هذا القاموس باستخدام كل عنوان بريد إلكتروني من التنزيل كمفتاح، مع وجود حارس كقيمة هذا المفتاح (مثل [NSNull null]).

بعد ذلك، قم بالتكرار خلال كل ABRecordRef في دفتر العناوين، واتصل ABRecordCopyValue(record, kABPersonEmailProperty) والتكرار خلال النتائج في كل ABMultiValue التي تم إرجاعها.إذا كان أي من عناوين البريد الإلكتروني عبارة عن مفاتيح في ذاكرة التخزين المؤقت لديك، فقم بتعيينها [NSNumber numberWithInt:ABRecordGetRecordId(record)] كقيمة هذا المفتاح في قاموسك.

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

نصائح أخرى

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

شيء من هذا القبيل (تم تعديل هذا قليلاً من البرنامج التعليمي الذي وجدته على الويب والذي لا يمكنني العثور عليه الآن، أعتذر عن عدم الاستشهاد بالمؤلف):

- (void)loadContentForVisibleCells
{
    NSArray *cells = [self.table visibleCells];
    [cells retain];
    for (int i = 0; i < [cells count]; i++) 
    { 
        // Go through each cell in the array and call its loadContent method if it responds to it.
        AddressRecordTableCell *addressTableCell = (AddressRecordTableCell *)[[cells objectAtIndex: i] retain];
        [addressTableCell loadImage];
        [addressTableCell release];
        addressTableCell = nil;
    }
    [cells release];
}


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 
{
    // Method is called when the decelerating comes to a stop.
    // Pass visible cells to the cell loading function. If possible change 
    // scrollView to a pointer to your table cell to avoid compiler warnings
    [self loadContentForVisibleCells]; 
}


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
{
    if (!decelerate) 
    {
       [self loadContentForVisibleCells]; 
    }
}

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

يبدو أنك تحاول تنفيذ تحميل الصور البطيئة في UITableView.هناك مثال جيد من شركة Apple، وأشير إليه هنا:تحميل الصور كسول في UITableView

لمعلوماتك، لقد قمت بإصدار مكتبة مجانية وقوية وسهلة للقيام بتحميل الصور غير المتزامن والتخزين المؤقت السريع للملفات:الكائنات المدارة HJhttp://www.markj.net/asynchronous-loading-caching-images-iphone-hjobjman/

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