2012-03-21 2 views
0

NSCoding을 사용하여 몇 가지 필드가있는 사용자 지정 개체를 관리하고 그 중 하나의 이미지를 사용하고 있습니다. iOS 5.0 이상 만 타겟팅 중이며 ARC로 전환했습니다. 모든 일을하고 있지만 성능에 중점을두고 있습니다.이 질문을 보지 못했습니다. 여기서는 다음과 같습니다.NSCoding, NSData, UIImages 및 성능

UIImage를 NSData로 변환하고 주 NSCoding 파일에 추가합니다 (plist, if 중요)를 디스크에 저장합니다. 이미지가 두 개 이상인 경우 이미지 이름이 순차적이됩니다 (예 : image1, image2, image3). UITableView (크기가 조정 된 축소판)와 상세보기 모두에서 이미지를 사용합니다. 이에 대한 부정적인면은 plist 풍선이 크기가 있다는 것입니다. 즉, 모든 NSData를 한꺼번에로드하기 때문에 초기로드 시간이 느린 것을 의미합니다.

이 문제를 제거하고 한 번에 하나의 이미지 만로드하는 가장 좋은 방법은 무엇입니까?

내가 생각 한 것 : 나는 디스크에있는 NSData 쓰기

의 PLIST에 배열을 추가하고 배열에 각 이미지의 파일 이름 만 참조를 추가합니다. 그런 다음 지정된 위치에서 이미지 파일 이름을 참조하여 디스크에서 찾은 다음 사용하는 것이 좋습니다.

모든 의견을 환영합니다. 나는 무엇보다도 개념 구현에 더 박차 고있어, 재미있게도 충분히 논의 된 주제는 아니다.

감사합니다,

편집 : 아래의 요청으로

, 여기에 이미지를 복용하고있는 NSData로 돌려의 예입니다 :

UIImage *originalImage; 

      NSData *imageData = UIImagePNGRepresentation(originalImage); 
      //I save it all to the app's document directory 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 

    //I am using the images in a tableView and thus found it easiest to append the row number to each image filename. 
//'y' below is just an integer that corresponds to the number of items in the master array 

      NSString *fileName = [NSString stringWithFormat:@"image%d.png",y]; 
      documentsDirectory = [documentsDirectory stringByAppendingPathComponent:fileName]; 
      [imageData writeToFile:documentsDirectory atomically:YES]; 

      // NSLog(@"The filename is %@", fileName); 

      //newObject is an instance of my NSCoding object 
      [newObject setImageName: fileName]; 
+1

그래는 별도의 파일로 이미지를 저장하고 파일 이름으로 그들을 참조에 대한 당신의 생각은 내가 할 줄 정확히이다. 레코드 수가 많아서 이미지가 아닌 모든 필드를로드하는 데 오랜 시간이 걸리기 시작했다면 이미지 데이터가 아닌 코어 데이터로 전환했을 것입니다. – yuji

+0

UIImage를 NSData로 직렬화하는 간단한 코드 예가 ​​있습니까? 그것은 내가하고있는 프로젝트에 유용 할 것이고, 다른 사람들에게는 의심의 여지가 없습니다. –

답변

2

귀하의 제안 소리입니다. 관계형 데이터베이스를 상상해보십시오. 나는 하나의 필드에 이미지를 블롭으로 저장하지 않을 것이다. 파일 시스템은 바이너리 날짜를 대량으로 저장하는 좋은 장소이다. 또한 파일을 복제하는 등의 쉬운 방법을 제공합니다.

그래서 plist에 참조를 저장하면 구문 분석이 매우 빨라지고 필요할 때만 이미지 처리가 쉬운 작업을로드하게됩니다.

+0

백업 해 주셔서 감사합니다, Nick. 훌륭하게 일했습니다! 20 개 항목으로 plist는 약 5 KB로 유지되고 이미지는 필요할 때만 호출됩니다. –

1

iOS 프로그래밍 : Big Nerd Ranch 가이드는 제 3 판 14 장에서이 솔루션의 완벽한 예를 보여줍니다. 완성 된 솔루션을 얻으려면 사이트에서 액세스 할 수있는 코드 만 다운로드하면됩니다.

iOS Programming 3rd edition

Download Solutions

+0

이것은 실제로 문제에 직접적으로 대답하는 것은 아니지만 누군가가 문제의 '해결 된'버전의 완전한 작동 예제를 볼 수있는 곳을 가리켜주는 것이 항상 나에게 매우 도움이됩니다. - 감사합니다! – AndrewPK