【问题标题】:Serialize a NSMutableArray that includes classes not implementing NSCoding序列化包含未实现 NSCoding 的类的 NSMutableArray
【发布时间】:2015-04-08 12:31:54
【问题描述】:

我需要将NSMutableArray 保存到磁盘,以便存储我的应用程序数据。我知道有很多类似的问题,但我发现没有一个能涵盖我的问题。

我不想仅仅为了保存一个NSMutableArray 而集成Core Data。通常我会去实现NSCoding 协议并使用NSKeyedUnarchiver。不幸的是,我的数据模型类有一些来自库的外部类,它们没有实现NSCoding 协议。

那么对我来说存储数组的最佳方式是什么?

这是我尝试过的,但由于给定的原因,它不起作用:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <ForeignFramework/ForeignFramework.h>

@interface DEModelClass : NSObject <NSCoding>

@property (nonatomic,strong) ForeignFramework *foreignFramework;
@property (nonatomic,strong) UIImage *image;
@property (nonatomic,copy) NSNumber *number1;
@property (nonatomic,copy) NSNumber *number2;

@end


#define kEncodeKeyForeign   @"kEncodeKeyForeign"
#define kEncodeKeyImage      @"kEncodeKeyImage"
#define kEncodeKeyNumber1     @"kEncodeKeyNumber1"
#define kEncodeKeyNumber2     @"kEncodeKeyNumber2"


#pragma mark - NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.foreignFramework   forKey:kEncodeKey];
    [aCoder encodeObject:self.image  forKey:kEncodeKeyImage];
    [aCoder encodeObject:self.number1 forKey:kEncodeKeyNumber1];
    [aCoder encodeObject:self.number2 forKey:kEncodeKeyNumber2];

}

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super init]))
    {
        self.foreignFramework = [aDecoder decodeObjectForKey:kEncodeKeyForeign];
        self.image    = [aDecoder decodeObjectForKey:kEncodeKeyImage];
        self.number1   = [aDecoder decodeObjectForKey:kEncodeKeyNumber1];
        self.number2   = [aDecoder decodeObjectForKey:kEncodeKeyNumber2];

    }
    return self;
}

【问题讨论】:

  • NSUserDefaults怎么样?
  • 嗯 NSUserDefaults 并不是存储整个数据数组的正确位置,对吧?
  • 为什么不呢?另一种选择是以编程方式创建一个plist 文件并将您的数据存储在其中,并在需要时检索。查看THIS。苹果自己的代码将数据保存到plist
  • 没有“序列化”任意类的标准方法。如果该类不是系统知道如何处理的类之一,则您必须发明自己的方案,也许使用 JSON。
  • 我在上面与THIS 共享的链接将处理imagenumber1number2。不能说foreignFramework

标签: ios objective-c cocoa-touch serialization nsarray


【解决方案1】:

你应该使用NSCoding协议,你可以使用它。

A.我假设您知道要存储外部类的哪些属性。 (可能是让您在加载时重新实例化实例对象的数据。)如果没有,则无法存储它们。当然,Cocoa,NSArray,$whatever 都不知道。这些是通用的。

B.选择完要存储的属性后,只需将类别添加到为您完成这项工作的外部类:

@interface ForeignClass (MyCodingAddition)
- (void)encodeWithCoder:(NSCoder*)encoder;
- (id)initWithCoder:(NSCoder*)decoder;
@end

@implementation ForeignClass (MyCodingAddition)
- (void)encodeWithCoder:(NSCoder*)encoder
{
  [coder encodeObject:self.property withKey:…]
  …
}

- (id)initWithCoder:(NSCoder*)decoder
{
  self = [super init];
  if (self)
  {
    self.property = [decode objectForKey:…];
    …
  }
  return self;
}
@end

【讨论】:

  • Keine Sache,Safari getippt 中的 ist allerdings。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 2011-10-26
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
相关资源
最近更新 更多