1

NSManagedObjectID を使用していくつかの問題に遭遇し、保存された状態に応じて変化します。

そのため、ドキュメントや他の人が推奨する独自の UniqeID を使用することにしました。ここのスタック オーバーフローや、コア データ フィールドに NSUUID 文字列値を格納するだけの単純な問題である他の場所で、多くの例を見てきました。

しかし、これは私が望むものには十分ではありません。NSManagedObjectID の便利な点の 1 つは、常に同じオブジェクトであり、ポインターで比較できることです。そのため、NSManagedObjectID をオブジェクトとして使用して通知を投稿できます。エンティティに関する情報を必要とするものはすべて、NSManagedObjectID に基づいて通知に登録できます。追加のコードを記述せずに、通知が実際に探しているものかどうかを確認します。

しかし、NSManagedObjectID の代わりに NSString が渡された場合でも、それは真実でしょうか? 同じオブジェクトであっても、NSString の比較には常に isEqualTo を使用することになっています。通知用のオブジェクトとして NSString を使用するのは少しもったいない気がします。

私の場合、目的の c が舞台裏で NSString をいじらない限り、同じオブジェクトであることがほぼ保証されています。uniqueID はオブジェクトの挿入時に一度生成され、必要に応じて変更されずに渡されます。NSManagedObjectID を使用するすべての呼び出しを、最小限の変更でドロップできるものに置き換えたいだけです。

CFUUID は、ポインター値を共有することが保証されているため、理想的に見えますが、CFUuidRef は目的の c オブジェクトではないため、特に通知には使用できません。NSUUID は、同じオブジェクトであることが保証されていないというドキュメントの警告を除けば、次善のようです。しかし、私の NSUUID が単一のオブジェクトで作成、保存、取得される場合、渡される NSUUID がアプリケーション全体で同じオブジェクトであることを保証できますか? もしそうなら、NSString についても同じことが言えませんか? できたとしても、NSUUID を使用するだけでよかったと思います。

通知を使用して個別のスレッド間で情報を投稿しているため、エンティティを直接渡すことはできません。メイン スレッド上のエンティティのみを変更し、エンティティはスレッド間で読み取り専用でアクセスできますが、NSManagedObjectID のみを使用するシステムを実装すると、過去に多くの問題が解消されました。

4

1 に答える 1

0

間違っているかもしれませんが、NSUUID( のインスタンスを使用したくない場合NSString) のインスタンスを渡し、それらを等しいかどうか比較してみませんか?

@interface NSUUID(Equality)
- (BOOL)isEqualToUUID:(NSUUID*)other;
@end

@implementation NSUUID(Equality)
- (BOOL)isEqualToUUID:(NSUUID*)other
{
   return [self.UUIDString isEqualToString:other.UUIDString];
}

// Only for completness
- (BOOL)isEqual:(id)other
{
  if( [other isKindOfClass:[NSUUID class]] )
  {
    return [self isEqualToUUID:other];
  }
  return NO;
}
@end

ところで: のインスタンスを通知オブジェクトとして使用することを気分を害するのと同じ理由は、 ?NSStringのインスタンスには当てはまりません。NSUUID

ところで 2: ARC コードで CF オブジェクトを処理することはそれほど難しくありません。

于 2015-06-30T12:38:09.377 に答える