문제

내 앱에는 a가 있습니다 NSDictionary 그의 열쇠는 서브 클래스의 인스턴스 여야합니다 NSManagedObject.

그러나 문제는 그 것입니다 NSManagedObject 구현하지 않습니다 NSCopying 핵심 데이터 객체 / 인스턴스가 없음을 의미하는 프로토콜 NSManagedObject 비록 사전 키로 사용할 수 있습니다 -[hash] 방법은 그들에게 잘 작동합니다.

내가해야 했어?

도움이 되었습니까?

해결책

네 가지 옵션이 있습니다.

  1. 대신 다른 객체를 사전 키로 사용하고 그로부터 조회하십시오. [object objectID] 또는 +[NSValue valueWithNonretainedObject:] 가장 분명해 보입니다
  2. 사용 CFDictionaryCreateMutable() 사전을 만들기 위해 유지 대신 복사하지 않고 키를 다음 CFDictionarySetValue() 물체를 저장합니다
  3. OS X 또는 iOS6+에서 [NSMapTable mapTableWithStrongToStrongObjects] 순전히 객관적인 C와 동등한 것을 제공합니다 CFMutableDictionary
  4. 구현하다 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 주변에 이러한 엔티티를 통과하면 사용하려면 동일해야합니다.

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