سؤال

أرغب في حفظ NSMutableDictionary كائن في NSUserDefaults.نوع المفتاح في NSMutableDictionary يكون NSString, ، نوع القيمة هو NSArray, ، والذي يحتوي على قائمة الكائنات التي يتم تنفيذها NSCoding.لكل وثيقة، NSString و NSArray كلاهما مطابق ل NSCoding.

سأتعامل مع هذا الخطأ:

[مجموعة NSUserDefaults:للمفتاح:]:محاولة إدراج قيمة غير خاصية....من فئة NSCFDictionary.

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

المحلول

وتبين لي بديل واحد، قبل حفظها، I ترميز الكائن الجذر (كائن NSArray) باستخدام NSKeyedArchiver الذي ينتهي مع NSData. ثم استخدم UserDefaults حفظ NSData.

عند أنا في حاجة إلى البيانات، وأنا أتلو NSData، واستخدام NSKeyedUnarchiver لتحويل NSData إلى كائن.

ومن مرهقة قليلا، لأنني في حاجة لتحويل إلى / من كل مرة NSData، لكنه يعمل فقط.

وهنا مثال واحد لكل طلب:

حفظ:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];

تحميل:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

وعنصر في مجموعة الأدوات

@interface CommentItem : NSObject<NSCoding> {
    NSString *value;
}

وبعد ذلك في تنفيذ CommentItem، يوفر طريقتين:

-(void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:value forKey:@"Value"];
}

-(id)initWithCoder:(NSCoder *)decoder
{
    self.value = [decoder decodeObjectForKey:@"Value"];
    return self;
}

وأي شخص لديه حل أفضل؟

وشكرا للجميع.

نصائح أخرى

إذا كنت تقوم بحفظ كائن في التخلف عن المستخدم، كل الأشياء، وبشكل متكرر، على طول الطريق، يجب أن تكون قائمة الممتلكات الكائنات. مطابقة للNSCoding لا يعني أي شيء here-- سوف NSUserDefaults لا ترميز لهم تلقائيا إلى NSData، عليك أن تفعل ذلك بنفسك. إذا كان لديك "قائمة من وجوه الذي ينفذ NSCoding" تعني الأشياء التي ليست كائنات قائمة الممتلكات، ثم سيكون لديك لتفعل شيئا معهم قبل الحفظ إلى الإعدادات الافتراضية للمستخدم.

ومعلوماتك الطبقات قائمة الممتلكات هي NSDictionary، NSArray، NSString، NSDate، NSData، وNSNumber. يمكنك كتابة فرعية قابلة للتغيير (مثل NSMutableDictionary) لتفضيلات المستخدم ولكن الكائنات التي تلا يكون دائما غير قابل للتغيير.

هل كل من المفاتيح الخاصة بك في NSStrings القاموس؟ أعتقد أنها يجب أن تكون من أجل إنقاذ القاموس إلى قائمة الممتلكات.

أبسط إجابة :

NSDictionary هو فقط أ كائن بليست ، إذا كان المفاتيح هي NSStrings.لذا، قم بتخزين "مفتاح" مثل NSString مع stringWithFormat.


حل :

NSString *key = [NSString stringWithFormat:@"%@",[dictionary valueForKey:@"Key"]];

فوائد :

  1. وسوف تضيف قيمة السلسلة.
  2. وسوف تضيف قيمة فارغة عندما تكون قيمة المتغير الخاص بك NULL.

هل تعتبر النظر في تنفيذ بروتوكول NSCoding؟ هذا سيسمح لك تشفير وفك على اي فون مع اثنين من الأساليب البسيطة التي يتم تنفيذها مع NSCoding. أولا كنت في حاجة إلى إضافة NSCoding إلى الدرجة الخاصة بك.

وهنا مثال:

وهذا هو في الملف .h

@interface GameContent : NSObject <NSCoding>

وبعد ذلك سوف تحتاج إلى تنفيذ طريقتين لبروتوكول NSCoding.

    - (id) initWithCoder: (NSCoder *)coder
    {
        if (self = [super init])
        {
               [self setFoundHotSpots:[coder decodeObjectForKey:@"foundHotSpots"]];
        }
        return self;
    }

    - (void) encodeWithCoder: (NSCoder *)coder
    {
           [coder encodeObject:foundHotSpots forKey:@"foundHotSpots"];
    }

تحقق من الوثائق المتعلقة NSCoder لمزيد من المعلومات. والتي تأتي في متناول اليدين حقا لمشاريعي حيث أحتاج إلى إنقاذ الدولة من التطبيق على اي فون إذا كان التطبيق مغلق واستعادته مرة أخرى لانها دولة عند عودتها جرا.

والمفتاح هو لإضافة بروتوكول إلى واجهة ثم تنفيذ طريقتين التي هي جزء من NSCoding.

وآمل أن يساعد هذا!

وليس هناك حل أفضل. وثمة خيار آخر يتمثل في مجرد حفظ الكائن المشفرة إلى القرص - ولكن هذا هو فعل الشيء نفسه. كلاهما في نهاية المطاف مع NSData أن يحصل على فك عندما تريد إعادته.

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