2014-10-12 5 views
3

"당신 포함하는 응용 프로그램과 데이터 공유"에서 응용 프로그램 확장에 대한 문서가 당신이 데이터에 액세스합니다. 사용 코어 데이터를 동기화해야합니다, 그렇게, 쓰고 조금 더NSUserDefaults는 IOS의 확장간에 데이터를 공유하기에 안전합니까?

는 "데이터 손상을 방지하는 것과 NSUserDefaults를 사용하여, SQLite 또는> Posix 잠금을 사용하여 공유 컨테이너에서 데이터 액세스를 조정할 수 있습니다. "

하지만 NSUserDefaults에 대한 문서를 볼 때이

을 말한다 "는 NSUserDefaults 클래스는 스레드 안전합니다."

내 확장 프로그램과 컨테이너 응용 프로그램간에 NSUserDefaults를 사용할 때 어떤 종류의 잠금을 사용해야합니까?

답변

1

설명서는 데이터를 공유하는 한 가지 방법의 주된 예로 NSUserDefaults을 사용하지만 많은 일시 중지없이 다른 옵션도 다루기 때문에 지나치게 명확하지 않습니다. 우선 잠금을 시도하지 않고 NSUserDefaults을 사용하기에 충분히 안전해야합니다. 나는 그것을 사용하여 Today 확장을 구축했으며 데이터 손상에 대해서는 아무런 문제가 없었습니다. 그래도 각 쓰기 후에 synchronize으로 전화를 걸므로 데이터가 즉시 저장되는지 확인하십시오.

4

스레드 안전성은 다른 스레드가 해당 구조를 보거나 변경하는 기능을 손상시키지 않는 방식으로 메모리 내 데이터 구조를 한 스레드에서 변경할 수있는 기능을 가리 킵니다. NSUserDefaults을 사용하여 앱 확장과 앱을 포함하는 앱간에 데이터를 공유 할 때 여러 스레드간에 메모리 내 데이터를 공유하지 않으면 디스크에 개의 데이터가 개의 프로세스 사이에 공유되므로 스레드 안전성에 대한 설명 적용되지 않습니다.

NSUserDefaultssynchronize에 대한 설명서는 확실하게 말하지 않지만 원자 파일 쓰기를 사용한다고 가정 할 수 있습니다. 즉, 한 프로세스가 다른 프로세스에서 부분적으로 작성된 파일을 읽을 위험이 없습니다. 앱이 기본값을 기록하고 내선 번호가 앱을 읽는 사이 (또는 그 반대로) 경쟁 조건이나 기타 타이밍 문제가 염려되는 경우 중요 글의 직후와 중요 읽기 직전 synchronize을 꼭 확인하십시오.

데이터 손상에 대한 주석은 일반 파일 읽기/쓰기 작업에 적용됩니다. 한 프로세스가 부분적으로 작성된 파일을 읽거나 파일 내용을 부분적으로 덮어 쓸 수 있으므로 순식간에 두 프로세스에서 파일을 읽거나 쓰면 데이터가 손상 될 수 있습니다. 자신의 파일 I/O를 직접 수행하는 경우 조정 메커니즘 (예 : NSFileCoordinator)이 필요하지만 iOS 앱/확장 프로그램 in iOS 8.2 and newer 사이에서만 올바르게 작동합니다. 또는 CFPreferences/NSUserDefaults, SQLite, Core Data 또는 Posix 파일 잠금과 같은 자체 조정을하는 고급 유틸리티를 사용할 수 있습니다.

TLDR : 예. 안전하게 확장 프로그램과 포함 된 앱간에 공유하려면 NSUserDefaults을 안전하게 사용할 수 있습니다. 그냥 in Apple's app extensions guide 권장 사항을 따르십시오.