سؤال

أنا أكتب تطبيق iPhone - عميل لبعض الشبكات الاجتماعية. التطبيق يدعم حسابات متعددة. يتم تخزين المعلومات حول الحسابات في أرشيف مفكن.

طريقة تستخدم للحفظ:

- (void) saveAccounts {
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *path = [paths objectAtIndex:0];
 path = [path stringByAppendingPathComponent:@"accounts.bin"];
 // NSMutableArray *accounts = ...;
 [NSKeyedArchiver archiveRootObject:accounts toFile:path];
}

تستخدم طريقة للقراءة:

- (NSMutableArray *) loadAccounts {
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *path = [paths objectAtIndex:0];
 path = [path stringByAppendingPathComponent:@"accounts.bin"];
 NSMutableArray *restoredAccounts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
 return [restoredAccounts retain];
}

طريقة saveAccounts يستخدم فقط إذا تمت إضافة بعض الحساب / تعديل / تم حذفه. طريقة loadAccounts يستخدم في كل مرة يبدأ التطبيق. لا يوجد أي رمز آخر يمكن الوصول إلى هذا الملف.

أنا وواحد من اختباري يحصل على مشكلة. في بعض الوقت تبدأ في التصرف مثل accounts.bin مفقود. إذا loadAccounts عائدات nil, ، يوفر التطبيق إضافة حساب. بعد إدخال حساب (يجب أن يتصل التطبيق saveAccounts)، يعمل التطبيق بشكل طبيعي، ولكن عندما أطلقته مرة أخرى، يطلب مني إضافة حساب مرة أخرى. الحلول الوحيدة هي إعادة تثبيت التطبيق أيضا إلى iPhone، بعد إعادة تثبيتها يعمل لبعض الوقت مع أي مشاكل.

نحن (أنا ومسحني الذي يحصل على مشكلة) استخدم iPhone 3G مع 3.1.2. اختبار آخر لم يواجه هذه المشكلة على iPhone 3GS مع 3.1.2.

أي أفكار لماذا يختفي هذا الملف؟

تحديث

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

الآن تم العثور على الخطأ، ويتم تصحيح التعليمات البرمجية. لم تحل إجابة WKW مشكلتي، لكنها أجبرتني على حفر أعمق. شكرا لك!

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

المحلول

ماذا عن - كجهاز تصحيح الأخطاء - التحقق من محتويات دليل المستندات في LoadAccounts أو على الأقل كلما عاد Uncariver Nil. هناك بعض الكود أدناه للحصول على أسماء الملفات في الدليل. قم بتعيين نقطة توقف وفقط nsarray لعرض العناصر.
إذا كنت تستطيع أن ترى أن الملف موجود في DIR DIR، فإن مشكلتك هي في أي مكان آخر. ربما لم يكن الأرشفة بنجاح. تحقق من قيمة الإرجاع على المكالمة إلى أرشفة البيانات:

if( ! [NSKeyedArchiver archiveRootObject:accounts toFile:path] ){
    NSLog(@"Oooops! account data failed to write to disk");
}

احصل على أسماء الملفات في الدليل:

- (NSArray*) directoryContentsNames:(NSString*) directoryPath {
    NSArray* result;
    {
        result = [[NSFileManager defaultManager]
            directoryContentsAtPath: directoryPath];
    }
    if( result && [result count] > 0 ){
        NSMutableArray *items = [[[NSMutableArray alloc] init] autorelease];
        for( NSString *name in result ){
            if( ! [name isEqualToString:@".DS_Store"] )
                [items addObject: name];
        }
        result = items;

    }
    return result;
}

ربما قد يكون NSUserDefaults أسهل؟

أيضا، هل هناك سبب لاستخدام أرشيف مفصل (UN) بدلا من WritetoFile nsarray؟

if( ! [accounts writeToFile:path atomically:YES] )
    ; // do something since write failed

وقراءة الملف في:

NSMutableArray *accounts = [[NSArray arrayWithContentsOfFile:path] mutableCopy];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top