문제

Apple은 큰 XML 기반 데이터 세트를 iPhone 앱에 읽을 때 Binary Plist 형식을 사용하는 것이 좋습니다. 그들의 추론 중에는 XML 파싱이 iPhone에 대해 매우 세금을 부과하고 있다는 사실이 있습니다. 그러나 원격 웹 서버에 상주하는 파일을 먼저 변환해야합니다.

자주 변화하는 콘텐츠의 경우 수동으로 수행하는 것이 허용되지 않습니다. 가능하다면 웹 기반 앱이 명령 줄을 호출하여 변환 (예 : Plutil)을 수행하지 않으려 고합니다.

이 변환을 수행하기 위해 공개적으로 사용할 수있는 알고리즘이 있습니까?

도움이 되었습니까?

해결책

예. 모든 PLIST 코드는 CoreFoundation의 일부이며 OpenSource입니다. CoreFoundation은 Linux 및 Windows에서 직접 빌드 및 실행할 수 있으므로 Mac OS X에서 사용할 일반 API를 사용하여 CF 도구를 작성할 수 있지만 다른 플랫폼에서 빌드하여 실행할 수 있습니다.

보고 싶은 특정 API는 cfpropertyListWriteToStream (). CoreFoundation 코드는 제공됩니다 사과 (타르 볼)), 다른 곳에서.

마지막으로 파일을 얼마나 자주 업데이트하는지, 서버에서 절약 해야하는 프로세서의 양 및 데이터가 얼마나 반복되는지에 따라 데이터가 남아있을 수 있습니다. 기본적으로 바이너리 plist의 특정 요소는 고유합니다 (예 : 문자열). 다른 요소는 (예 : 배열 및 사전)가 아닙니다. 이진 plist 형식을 사용하면 고유 한 형식을 사용할 수 있습니다. 문제는 실제로 걸어가는 것이 비용이 많이 들고 독특한 배열과 사전은 비싸다는 것입니다. 콘텐츠에 동일한 배열이나 딕트가 많으면 고유 한 크기가 크기가 크게 줄어 듭니다. _flattenplist ()를 해킹하여 cfbinaryplist.c.

그렇게하면 매우 철저히 테스트하고 파일에서는 네트워크를 통해 업데이트 할 수없는 파일을 수행하지 않으면 향후 릴리스가이를 깨뜨리는 최적화를하는 경우를 대비하여 네트워크를 통해 업데이트 할 수 없습니다. 또한 순간 통지에 꺼질 준비가되어 있는지 확인하십시오.

다른 팁

PHP 및 Ruby 구현이 있습니다.

http://code.google.com/p/cfpropertylist/

링크 된 루비 구현은 루비 1.9입니다. 루비 1.8에서 작동하는 빠른 바이너리 세리어 라이저를 제압했습니다.

http://gist.github.com/303378

iPhone 또는 서버에서 변환을하고 싶을 지 확실하지 않습니다. 서버에 있고 코코아 프레임 워크를 사용할 수있는 경우 NSPropertyListSerialization OS X (10.2 이후)에서 지원되는 유형 (문자열, XML 및 이진)을 변환 할 수있는 서비스를 제공합니다. 대신 사용하려면 Core Foundation 라이브러리에 유사한 방법이 있습니다.

XML plist를 이진을 변환하려면 :

NSString *xmlPlistPath; // already set
NSString *outPath; // already set


NSData *plistData;
NSString *error;
NSPropertyListFormat format;
id plist;
plistData = [NSData dataWithContentsOfFile:xmlPlistPath];

plist = [NSPropertyListSerialization propertyListFromData:plistData
                                         mutabilityOption:NSPropertyListImmutable
                                                   format:&format
                                         errorDescription:&error];

if(plist == nil) { // unable to parse plist
    //deal with failure -- error gives description of the error
} else {
    binaryPlistData = [NSPropertyListSerialization dataFromPropertyList:plist
                                                                 format:NSPropertyListBinaryFormat_v1_0
                                                       errorDescription:&error];
    if(binaryPlistData == nil) {//unable to create serialized plist
         // deal with failure -- error gives description of the error
    }

    if(![binaryPlistData writeToFile:outPath atomically:YES]) {
        // unable to write file
    }
}

보다 속성 목록 공동 가이드 자세한 내용은 Developer.apple.com의 페이지입니다.

명령 줄 도구 Plutil- 속성 목록 유틸리티

Apple은 속성 목록 파일을 망칠 수있는 매우 좋은 명령 줄 도구를 가지고 있습니다.

  • /usr/libexec/Plistbuddy - 편집을 위해
  • /usr/bin/plutil - 구문 검사 및 유형 변환

Plutil Man 페이지 :

Plutil을 사용하여 속성 목록 파일의 구문을 확인하거나 한 형식에서 다른 형식에서 다른 파일을 변환하는 데 사용될 수 있습니다. 지정 - 입력 파일이 stdin에서 읽습니다.

기존 PLIST를 XML, 이진 또는 JSON 형식으로 변환

plutil -convert xml1 stops2.plist
plutil -convert binary1 stops2.plist
plutil -convert json stops2.plist

Perl 구현도 호출됩니다데이터 :: plist

그만큼 binary_plist 보석 Rails 컨트롤러를위한 유효한 응답 형식으로 plist를 추가하는 것은 유망한 것처럼 보입니다.

서버 며칠 전 iOS에서 Plist Binary Data를 사용하여 네트워킹에 몇 가지 문제가 발견되었습니다. Gist 내 것은 문제를 간단히 해결하는 것입니다. Swift로 작성된 PLIST 변환기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top