4

の次のインスタンス メソッドをどのように実装しますかNSSet:

- (BOOL)containsMemberOfClass:(Class)aClass

知りたい理由は次のとおりです。

コア データ モデル:ここに画像の説明を入力

Facebook の承認をユーザーの承認に追加するにはどうすればよいですNSSetか。ただし、まだ存在しない場合に限ります。言い換えれば、ユーザーは多くの権限を持つことができますが (将来 Twitter (たとえば) 権限を追加することを選択した場合)、各種類の権限を 1 つだけ持つ必要があります。では、if (![myUser.authorizations containsMemberOfClass:[Facebook class]])Facebook 認可インスタンスを に追加しますmyUser

4

5 に答える 5

3

残念ながら、すべての承認をループして確認する必要があります。

@interface NSSet (ContainsAdditions)

- (BOOL)containsKindOfClass:(Class)class;
- (BOOL)containsMemberOfClass:(Class)class;

@end

@implementation NSSet (ContainsAdditions)

- (BOOL)containsKindOfClass:(Class)class {
    for (id element in self) {
        if ([element isKindOfClass:class])
            return YES;
    }
    return NO;
}

- (BOOL)containsMemberOfClass:(Class)class {
    for (id element in self) {
        if ([element isMemberOfClass:class])
            return YES;
    }
    return NO;
}

@end
于 2011-04-29T21:52:42.637 に答える
1

Core Data では、実際には NSPredicate で NSFetchRequest を使用するのがベスト プラクティスです。これを行うには、AuthorizationType のような属性を Authorization オブジェクトに追加する必要があります。その後、次のことができます。

NSManagedObjectContext *moc = [self managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY user.authorizations.authorizationType == %@", @"facebook"];
[request setEntity:[NSEntityDescription entityForName:@"Authorization" inManagedObjectContext:moc]];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *result = [moc executeFetchRequest:request error:&error];

次に、の数をチェックして、result存在するかどうかを確認できます。NSPredicate を使用すると、Apple が CoreData に追加した最適化を使用できます。ここにApple Docsがあります。

于 2011-04-29T22:11:16.070 に答える
0

古い質問ですが、少し異なる答え:

NSPredicate *objectTypeFilter = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return [evaluatedObject isKindOfClass:NSClassFromString(@"MyObject")];
}];
NSSet *myObjects =[allObjects filteredSetUsingPredicate:objectTypeFilter];
if (myObjects.count>0) {
    // There was at least one object of class MyObject in the allObjects set
}
于 2013-11-12T11:26:53.473 に答える
0

あなたはこれについて間違った方法で行っています。承認のタイプが一般的で重要なものである場合は、その構造を外部コントローラー コードに課すのではなく、データ モデルで直接モデル化する必要があります。

承認の固定セットがある場合は、それらの承認をモデル化するエンティティを作成する必要があります。

Facebook{
    accessToken:string
    experationDate:date
    authorization<-->Authorizations.facebook
}

Google{
    username:string
    password:string
    authorization<-->Authorizations.google
}

Authorizations{
    user<-->User.authorizations
    facebook<-->Facebook.authorization
    google<-->Google.authorization
}

これで、所属するデータ モデルにすべての承認が取り込まれました。物事をより引き締めるために。クラスにカスタム メソッドを追加して、User承認の追加と削除を制御できます。

ここでの重要な考え方は、データを管理するすべてのロジックを可能な限りデータ モデルにカプセル化する必要があるということです。これにより、(1) インターフェイスに依存しないすべてのデータ操作をテストし、(2) データ モデルを壊さずにインターフェイス要素を簡単に追加および削除できます。

于 2011-04-30T16:39:50.137 に答える
0

Userこのインスタンス メソッドをクラスに追加するとどうなるでしょうか。

- (BOOL)hasFacebookAuthorization {
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user.id == %@", [self id]];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Facebook"
                                   inManagedObjectContext:managedObjectContext]];
    [fetchRequest setPredicate:predicate];

    NSError *error;
    NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (!result) {
        // TODO: Handle the error appropriately.
        NSLog(@"hasFacebookAuthorization error %@, %@", error, [error userInfo]);
    }

    return [result count] > 0;
}
于 2011-04-29T23:25:42.187 に答える