nsdictionary 키로 nsmanagedObject?
-
19-09-2019 - |
문제
내 앱에는 a가 있습니다 NSDictionary
그의 열쇠는 서브 클래스의 인스턴스 여야합니다 NSManagedObject
.
그러나 문제는 그 것입니다 NSManagedObject
구현하지 않습니다 NSCopying
핵심 데이터 객체 / 인스턴스가 없음을 의미하는 프로토콜 NSManagedObject
비록 사전 키로 사용할 수 있습니다 -[hash]
방법은 그들에게 잘 작동합니다.
내가해야 했어?
해결책
네 가지 옵션이 있습니다.
- 대신 다른 객체를 사전 키로 사용하고 그로부터 조회하십시오.
[object objectID]
또는+[NSValue valueWithNonretainedObject:]
가장 분명해 보입니다 - 사용
CFDictionaryCreateMutable()
사전을 만들기 위해 유지 대신 복사하지 않고 키를 다음CFDictionarySetValue()
물체를 저장합니다 - OS X 또는 iOS6+에서
[NSMapTable mapTableWithStrongToStrongObjects]
순전히 객관적인 C와 동등한 것을 제공합니다CFMutableDictionary
- 구현하다
NSCopying
관리되는 객체 서브 클래스의 경우 자체를 반환하도록합니다 (아크를 사용하지 않는 경우 기준 수가 범프
메모
+valueWithNonretainedObject:
매달려있는 포인터가 남아있을 수 있기 때문에 매우 위험합니다. 피하는 것이 가장 좋습니다.
객체 ID를 저장하는 것은 새로운 물체는 a 일시적인 ID. 그런 다음 해당 ID는 컨텍스트가 디스크에 저장 될 때 영구적 인 것으로 변경됩니다 (또는 -obtainPermanentIDsForObjects:…
).). 수신 객체에 이미 영구 ID가 있음을 보장 할 수없는 한 매핑 코드는이를 처리 할 수있을 정도로 똑똑해야합니다.
구현 NSCopying
이렇게하면 약간 칙칙한 느낌이 들지만 잘 작동해야합니다. 그것이 일어나기 때문에 이것은 정확히 접근법입니다 NSURLSessionTask
나는 사전 친근감을 추정합니다.
OS X 10.8 Mountain Lion 이전에 정기적으로 만들 수있었습니다. NSMutableDictionary
그런 다음 전화하십시오 CFDictionarySetValue()
그것을 위해. 그래도 더 이상 그렇지 않습니다. 새로운 사전은 이제 순전히 특징이 아니라 CF 수준에서 적절한 사본 콜백을 지정했습니다. NSMutableDictionary
.
다른 팁
사전 키로 사용하려는 nsmanagedObject 인스턴스에 대한 참조가 포함 된 래퍼 클래스를 만들 수 있습니까? 그런 다음이 래퍼 클래스가 해시 메소드 (아마도 nsmanagedobject의 해시 메소드라고 함)와 함께 nscopying을 구현 하고이 래퍼를 사전 키로 사용할 수 있습니다.
[[MymanagedObject ObjectId] urirepresentation] Absolutestring]을 키로 사용하는 것이 좋습니다.
비슷한 문제가 있었는데, 각 엔티티가 각각에 대한 추가 데이터로 묶어야했고 처음에는 시도했습니다.
@{entity1:data1, @entity2:data2, @entity3:data3}
이것은 위의 이유 (nscopying)에 대해서는 효과가 없었으므로 다음과 같습니다.
@[
@{@"entity":entity1, @"data":data1},
@{@"entity":entity2, @"data":data2},
@{@"entity":entity3, @"data":data3}
]
그러나이 솔루션은 이러한 엔티티에 사전 스타일의 액세스가 필요하지 않거나 필요한 것을 찾기 위해 반복하는 경우에만 적합합니다. 제 경우에는 포장 문제였습니다. NSManagedObjectContext 주변에 이러한 엔티티를 통과하면 사용하려면 동일해야합니다.