2013-08-17 2 views
0

데이터베이스 개체와 일부 사진 개체가 있습니다.NSKeyedArchiver로 부분 저장을 할 수 있습니까?

데이터베이스 개체에는 정수 속성과 변경 가능한 사전 속성이 포함되어 있습니다.

정수는 새 사진 객체를 만들고 변경 가능한 사전에 사진 객체에 대한 포인터가있는 경우 변경 가능한 사전 키로 사용할 다음 빈 번호를 추적합니다.

사진 개체에는 이미지, 이미지 설명 및 이미지를 찍은 날짜가 들어 있습니다.

내 applicationDidBecomeActive 및 applicationWillResignActive 메서드가 트리거 될 때 NSKeyedUnarchiver 및 NSKeyedArchiver를 사용하여 이러한 개체를 읽고 쓰는 데 사용하고 있습니다.

그리고 모두 잘 작동합니다. applicationWillResignActive가 트리거되면 NSKeyedArchiver를 호출하고 데이터베이스 객체를 루트로 가리 킵니다. 그런 다음 코더는 정수를 쓴 다음 변경 가능한 사전을 발견하면 해당 사전에 내리고 각 사진 객체가 호출되어 이미지, 설명 및 날짜와 같은 속성을 저장합니다.

내가 말했듯이 모든 것이 잘 작동합니다. 그러나 사진 수의 증가에 따라 느리고 느리게 보였으므로 약간의 타이밍을했습니다.

아카이브를 읽는 것이 쓰기 작업보다 대략 25 배 빠름을 발견했습니다.

그래서 필자는 쓰기면을 빠르게하는 방법으로 새롭거나 변경된 사진 만 쓰는 아이디어를 생각했습니다. 어쨌든 대부분의 사진은 과거의 세션에서 가져온 것이므로 30 ~ 50 개의 사진이있을 수 있으며 이번에는 2 ~ 3 개의 사진 만 촬영할 수 있습니다.

사진이 새롭거나 오래된 것인지 나타내는 플래그를 만들었습니다. applicationWillResignActive가 트리거되고 각 encodeWithCoder 호출을 처리하는 사진 객체에서 자신을 발견하면 사진이 새로운 경우 이미지, 설명 및 날짜를 ​​저장하고 이전 사진은 저장하지 않습니다.

글쎄, 내가 :-) 기대했던 결과를 얻지 않았다

applicationWillResignActive은, 모든 사진은 내가 끝을 작성하는 스킵 트리거 이전 사진 개체를 덮어 쓰기로 빈 사진 오브젝트를 작성하기 같은 열쇠가있어. 그런 다음 다시로드 할 때 bupkis, nada, zip이 있습니다.

첫 번째 질문은 내 개체 트리의 일부만 작성하고 내가 쓰지 않은 부분을 이전의 전체 작성에서 그대로 유지할 수 있습니까? 그게 순진한 생각인지 궁금해지기 시작했습니다.

개리 몬

답변

0

아카이브의 증가에 따라 객체 배열의 아카이브를 사용하는 것이 점차 비효율적이 될 것입니다. 이는 개체에 이미지가 포함되어 있다는 사실로 인해 악화됩니다. 두 생각은 :

  1. 이 데이터를 저장하기위한 Core Data을 사용하는 것이 좋습니다. (SQLite도 직접 사용할 수 있지만 Core Data는 iOS의 선호 객체 유지 기술입니다.) 이렇게하면 새 객체를 저장할 때마다 새 객체를 추가하고 매번 객체의 전체 컬렉션을 보관하지 않아도됩니다.

  2. 또한 속도가 중요시되고 이미지가 큰 경우 SQLite (코어 데이터가 기본적으로 사용하는 데이터베이스)는 대형 BLOB (예 : 이미지)를 처리 할 때 비효율적입니다. 그러므로 소리가 나는 것처럼 이미지를 Documents 폴더에 저장하고 CoreData에 이미지 파일 URL이나 경로 만 저장하려고합니다.

+0

Rob, 문서 폴더에 저장하기 위해 NSKeyedArchiver로 저장하고 복원하는 개체에서 이미지를 가져 오면 남아있는 내용이 충분히 빠를 것으로 판단됩니다. 그렇다면 더 큰 데이터로 미래를 준비하는 것 외에도 Core Data를 채택하면 어떤 이점이 있습니까? – Gallymon

+0

"Archives and Serializations Programming Guide"문서에서 다음과 같이 보았습니다 : "필요하지 않은 키를 읽지 마십시오. 특정 개체에 대한 아카이브의 모든 정보를 읽을 필요가 없습니다. 그러나 아직 읽지 않은 데이터는 여전히 아카이브의 크기에 기여합니다 .... " 이것은 내가 쓰고있는 객체가 있고 그 중 일부를 쓰지 않아도된다는 것을 의미합니까? 나중에 작성한 모든 객체를 읽을 때 이전에 작성한 객체의 이전 버전이 그대로 남아 있어야합니다. 아니면 내 부분에 대한 오해인가? – Gallymon

+0

@Gallymon 첫 번째 질문에 대한 대답으로, 객체에서 이미지를 가져온 경우 아카이버의 속도는 충분히 빠르지 만 여전히 효율적인 방법은 아닙니다 (컬렉션을 보관할 때 컬렉션의 모든 객체를 쓰는 이유는 무엇입니까? 새로운). 논리 도구는 핵심 데이터이지만, 원하는대로 할 수 있습니다. – Rob

0

왜 init 메서드에서만 이미지를 저장하지 않습니까? 개체를 만들면 기회를 저장하고 싶습니다. 그래서 초기화 메소드에 플래그 hasChanges ==를 설정하고 저장을위한 플래그를 확인하십시오. ...