2016-06-27 3 views
2

클래스를 열어서 파일로 내보낼 수 있기를 바랍니다. 그것은 편집 할 필요가 없습니다 - 이것은 단순히 내 객체의 다른 사용자들과 CoreData 데이터베이스를 공유하는 방법입니다. 그래서 서브 클래스 화의 복잡성이 필요하지 않다고 생각합니다. NSDocument.문자열 및 NSImage 속성이있는 클래스를 파일로 내보내기

클래스는 매우 기본이며 두 개의 속성 String과 앱 샌드 박스의 이미지를 참조하는 NSImage의 파일 이름이 있습니다.

처음에는 Document Bundle, 기본적으로 이미지가있는 폴더 (필요한 경우)와 문자열 및 이미지 파일 이름이있는 plist를 사용하려고 생각했습니다. 이제 이미지와 문자열을 파일에 저장하기 위해 NSCoding을 사용하는 내보내기 및 가져 오기를위한 클래스 작성에 기울이고 있습니다.

  • 이 좋은 생각입니다 : 여기

    내가 확실하지 않다 무엇인가? 내가 여기서 뭔가를 놓치고 있니?

  • NSImageString 속성을 가진 객체의 배열을 단일 파일로 저장할 수 있습니까? 나는 이미지를 쉽게 저장할 수 있다는 것을 알고 있지만, 하나의 문서로 묶을 수 있습니까? NSCoding이 방법이 있습니까?
  • 먼저 NSImageNSData으로 변환해야합니까?
  • 내 디코더는 파일의 어느 부분이 String이고 어떤 부분이 NSImage인지 어떻게 알 수 있습니까?

나는 내 연구를 수행했습니다! 이미지를 저장하거나 NSDocument을 저장하는 방법에 대한 정보가 많이 있지만 단지 사용자가 내 응용 프로그램의 핵심 데이터 저장소로 임의의 데이터를 내보내고 가져올 수있는 간단한 방법을 원합니다.

+0

멋진 답변 주셔서 감사합니다. 비슷한 질문을하는 미래의 사람들에게 이것은 좋은 자료입니다 : http://nshipster.com/nscoding/ – glenstorey

답변

2

NSCoding을 사용하면 내장 된 모든 클래스를 저장할 수 있습니다 포트를 선택하거나 추가하십시오. NSImage 및 물론 - NSStringNSCoding을 준수합니다. 당신은 단순히 사용자 정의 클래스, which is pretty simpleNSCoding 지원을 추가 할 수 있습니다

- (void)encodeWithCoder:(NSCoder*)coder 
{ 
    [coder encodeObject:self.stringProperty forKey:@"String Property"]; 
    [coder encodeObject:self.imageProperty forKey:@"Image Property"]; 
} 

- (instancetype)initWithCoder:(NSCoder*)coder 
{ 
    self = [super init]; // or `-initWithCoder:, if it is supported 
    if (self) 
    { 
    self.stringProperty = [coder decodeObjectForKey:@"String Property"]; 
    self.imageProperty = [coder decodeObjectForKey:@"Image Property"]; 
    } 
    return self; 
} 

당신이 재산 목록 파일로 데이터를 저장하려면

, 당신은 전적으로 속성 목록 클래스를 사용할 수 있습니다. NSString is a property list, but NSImage is not - 물론 맞춤 수업은 아닙니다. NSData은 속성 목록이므로 NSImage의 인스턴스와 사용자 정의 클래스를 NSData의 인스턴스로 변환해야합니다. 드럼 롤 - NSCoding으로 그 작업을 수행 할 수 있습니다. 열쇠가있는 아카이버를 사용하기 만하면됩니다. +archivedDataWithRootObject: ( NSKeyedArchiver)의 결과는 NSData의 인스턴스입니다. 다시 사용하는 방법은 NSKeyedUnarchiver입니다.

그러나 일반 속성 목록 도구로 편집하지 않으려는 경우 속성 목록의 파일 형식을 선택하지 않아도됩니다.

그래서, 당신의 품질 평가 점수에 직접 대답 :

이 좋은 생각을? 내가 여기서 뭔가를 놓치고 있니?

그것은 내가 하나의 파일로 NSImage와 문자열 속성을 가진 객체의 배열을 저장할 수 있습니다

괜찮아?

NSArrayNSCoding에 해당하며 속성 목록이므로 두 가지 방법 모두 사용 가능합니다.

이미지를 상당히 쉽게 저장할 수 있지만 하나의 문서로 묶을 수 있습니까?

귀하는 파일 소유자이며 귀하는 파일 형식을 정의합니다. 계속하세요.

이 작업을 수행하는 방법을 NSCoding 있습니까?

예.

먼저 NSImage를 NSData로 변환해야합니까?

속성 목록 파일을 저장하려는 경우에만.

1

두 가지 옵션 모두 정상적으로 작동합니다. NSCoding 경로로 이동하는 경우 열쇠가있는 아카이버를 사용해야합니다.

어느 옵션도 객체 배열을 처리 할 수 ​​있습니다. 파일 구조/처리 코드를 확인하고 처리해야합니다.

파일 옵션의 경우 이미지는 디스크의 이미지 일뿐입니다. 코딩 옵션의 경우 모든 것이 디스크의 바이너리 데이터이지만 코딩 프로세스 중에 수행됩니다 (이미지를 데이터로 변환).

파일의 구조에 따라 패키지의 파일 확장자가 될 수 있습니다. 코딩 옵션은 키 이름입니다.

귀하의 옵션은 모두 사용자에게 실질적으로 동일하며 장래에 확장 할 수 있습니다. 어느 것이 든 개인적인 취향에 따라 선택하십시오. 나는 코딩 옵션이 빠르고 쉽게 코드를 작성하기를 기대한다.

1

NSCoding 프로토콜을 구현하면 설명하는 개체를 쉽게 공유 할 수 있습니다.이 UIKit 함수 중 하나를 사용있는 UIImage에서있는 NSData 이것을 initializer

let image: UIImage = UIImage(data: <the nsdata decoded>) 

을 사용하여 수득을 NSData에서있는 UIImage를 생성하려면

public required init!(coder:NSCoder) 
{ 
    self.busStopName = coder.decodeObjectForKey("busStopName") as? String 
    self.busStopID = coder.decodeIntegerForKey("busStopID") as Int 
    let lines: [String]! = coder.decodeObjectForKey("busLines") as? [String] 
    let photo: NSData = coder.decorDataForKey("photo") as? NSData 
} 

public override func encodeWithCoder(encoder: NSCoder) -> Void 
{ 
    encoder.encodeObject(self.busStopName, forKey:"busStopName") 
    encoder.encodeInteger(self.busStopID, forKey: "busStopID") 
    encoder.encodeObject(self.busLines, forKey: "busLines") 
    encoder.encodeDataObject(self.busStopImage, forKey: "photo") 
} 

UIImageJPEGRepresentation(::) UIImagePNGRepresentation(_:)