지속적인 맞춤 개체
-
22-07-2019 - |
문제
NSObject에서 상속하는 사용자 정의 객체가 있습니다. 3 명의 멤버가 있습니다 - 2 개의 수레와 an NSDate
.
내 앱에는 이러한 객체가 여러 개를 차는 배열이있는 배열이 있으며, 실행 사이에 유지해야합니다. 이것을 어떻게 달성 할 수 있습니까?
나는 sqlite db를 사용하는 것에 대해 생각했지만, 내가 할 수있는 유일한 쿼리가 이후 약간 과잉이라고 생각합니다. select *
.
이상적인 세상에서는 XML PLIST 파일을 사용하고 싶습니다. 그래도 내 커스텀 객체 로이 작업을 수행 할 수 있는지 확실하지 않습니다. 속성 목록 개체 세트가 있다는 것을 알고 있습니다. NSArray
그 아래에 나옵니다 writeToFile:atomically:
속성 목록 객체와 만 작동합니다.
모든 생각이 감사하겠습니다. 감사합니다!
해결책
NSCoding
당신이 원하는 것을 정확히 할 것입니다. Apple Docs에서 읽는 것이 좋습니다. 그러나 사용하기가 매우 간단하다고 생각했습니다. 귀하의 수업 (및 모든 어린이 수업)은 NSCoding
프로토콜을 추가해야합니다 -encodeWithCoder:
그리고 -initWithCoder:
당신의 대상에 대한 방법. 대부분의 공통 프레임 워크 클래스가 구현됩니다 NSCoding
이미.
수업의 코드는 다음과 같습니다.
-(void) encodeWithCoder: (NSCoder*) coder {
[coder encodeInteger: versionValue forKey: versionKey];
[coder encodeObject: myStuff forKey: myStuffKey];
}
-(id) initWithCoder: (NSCoder*) coder {
self = [super init];
if ( ! self) return nil;
myStuff = [[coder decodeObjectForKey: myStuffKey] retain];
return self;
}
인코딩 할 때 버전 번호를 추가하여 향후 버전에서 아카이브 형식의 변경 사항을 관리 할 수있는 유연성을 제공하는 것이 좋습니다.
수업 시간에 나는 내 객체를 보관하기위한 편리한 방법을 추가했습니다.
-(void) archiveToFile: (NSString*) path {
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data];
[archiver encodeObject: self forKey: myArchiveKey];
[archiver finishEncoding];
[archiver release];
[data writeToFile: path atomically: YES];
[data release];
}
그리고 다른 하나는 미묘하거나 새 객체를 만들기위한 것입니다.
+(MyArchive*) newFromFile: (NSString*) path
orWithMyStuff: (MyStuff*) myStuff
{
NSData *data = [[NSData alloc] initWithContentsOfFile: path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey];
[unarchiver finishDecoding];
if (myArchive) {
[myArchive retain];
} else {
myArchive = [[MyArchive alloc] initWithStuff: myStuff;
}
[unarchiver release];
[data release];
return myArchive;
}
최상위 객체는 an입니다 NSArray
, 사례의 마지막 두 가지 방법을 수정해야하지만 대부분의 보일러 플레이트 코드는 동일합니다.
다른 팁
객체의 서브 세트를 검색하려면 SQLite가 최선의 선택입니다.
그렇지 않다면 Plist 형식과 NSCoding 중에서 선택합니다. Plist는 사용자 정의 객체를 Plist 친화적 인 것으로 변환 한 다음 Plist를 객체로 다시 변환 할 수 있어야하지만 NSCoding은 머리를 감싸기가 어렵고 손으로 쉽게 편집 (또는 검사) 할 수 없습니다. .