3

私はユーザーがいるアプリに取り組んでおり、各ユーザーはフォロワーと多対多の関係にあります。現在、新しいユーザー オブジェクトの保存に問題があります。アプリがクラッシュし managedObjectContext saveます。次のエラーが表示されます。

Unresolved error Error Domain=NSCocoaErrorDomain Code=1560 "The operation couldn’t be   completed. (Cocoa error 1560.)" UserInfo=0x8580640 {NSDetailedErrors=(
"Error Domain=NSCocoaErrorDomain Code=1550 \"The operation couldn\U2019t be completed.  (Cocoa error 1550.)\" UserInfo=0x85820c0 {NSValidationErrorObject=<User: 0x7575870> (entity:  User; id: 0x75757c0 

NSValidationErrorKey=followers, NSLocalizedDescription=The operation couldn\U2019t be completed. (Cocoa error 1550.), NSValidationErrorValue=Relationship 'followers' on managed object (0x7575870) <User: 0x7575870> (entity: User; id: 0x75757c0 
"Error Domain=NSCocoaErrorDomain Code=1550 \"The operation couldn\U2019t be completed. (Cocoa error 1550.)\" UserInfo=0x8586830 {NSValidationErrorObject=<User: 0x7571ec0> (entity: User; id: 0x7571f00 

"Error Domain=NSCocoaErrorDomain Code=1550 \"The operation couldn\U2019t be completed. (Cocoa error 1550.)\" UserInfo=0x858e820 {NSValidationErrorObject=<User: 0x7573120> (entity: User; id: 0x7573160  

[...]

このクラッシュの原因は何なのか、私にはよくわかりません。私の関係は次のようになります。

ここに画像の説明を入力

ここに画像の説明を入力

モデルには、 を持つカスタム NSManagedObject サブクラスがあり@property (nonatomic, retain) NSSet *followers;ます。私が言ったように、何がこれを引き起こしているのかよくわからないので、ガイダンスやアイデアは素晴らしいでしょう!

アップデート

この方法でアプリがクラッシュします。

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    [managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You   should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            // Uncomment "abort" makes it work, but I still get the error. 
            abort();
        }
    }
} 

更新 2

モデルのコードとその使用方法:

フェッチ リクエスト コントローラの設定方法:

- (NSSortDescriptor *)sortDescriptorForFetchRequest
{
    NSSortDescriptor *sortDescriptor;
    if ([self.postType isEqualToString:@"following"] || [self.postType isEqualToString:@"followers"]) {
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"userId" ascending:NO];
    } else {
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"postId" ascending:NO];
    }

    return sortDescriptor;
}

- (NSEntityDescription *)entityForFetchRequest
{
    NSEntityDescription *entity;
    if ([self.postType isEqualToString:@"followers"] || [self.postType isEqualToString:@"following"]) {
        entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:[self.appController managedObjectContext]];
    } else {
        entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:[self.appController managedObjectContext]];
        }

    return entity;
}

- (void)setUpFetchResultController
{
    if (self.fetchedResultsController == nil) {
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        [fetchRequest setEntity:[self entityForFetchRequest]];
        [fetchRequest setPredicate:[self predicateBasedOnPostType:self.postType]];
        NSArray *sortDescriptors = @[[self sortDescriptorForFetchRequest]];
        [fetchRequest setSortDescriptors:sortDescriptors];

        self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self.appController managedObjectContext] sectionNameKeyPath:nil cacheName:[self cacheName]];
        self.fetchedResultsController.delegate = self;
    }
}

そして私のモデルUser

+ (void)addUserFromDictionary:(NSDictionary *)dictionary forUser:(User *)user  inManagedObjectContext:(NSManagedObjectContext*)moc follower:(BOOL)follower following: (BOOL)following
{
    User *localUser;
    if (follower) {
        if ([dictionary isKindOfClass:[NSArray class]]) {
            NSEnumerator *enumerator = [dictionary objectEnumerator];
            id value;
            while (value = [enumerator nextObject]) {
                localUser = [self parseUserFromDictionary:value inManagedObjectContext:moc];

               if ([self user:localUser alreadyFollowingUser:user inManagedObjectContext:moc] == NO) {
                   [user addFollowersObject:localUser];
                   [localUser addFollowingObject:user];
              }   
            }
        }
    }
}

+ (User *)parseUserFromDictionary:(NSDictionary *)dictionary inManagedObjectContext:(NSManagedObjectContext*)moc
{
    NSNumberFormatter *numberFormatter= [[NSNumberFormatter alloc] init];
    NSNumber * userId = [numberFormatter numberFromString:(NSString *)[dictionary valueForKey:@"id"]];

    User *user;

    if ([self userAlreadyExist:userId inManagedObjectContext:moc] == NO) {
        NSEntityDescription *userDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext:moc];
        user = [[User alloc] initWithEntity:userDescription insertIntoManagedObjectContext:moc];
    } else {
        user = [User findUser:userId inManagedObjectContext:moc];
    }

    user.name = [dictionary valueForKey:@"name"];
    [...]    
    return user;
}
4

3 に答える 3

3

別のプロジェクトでコードとデータモデルを再現しました。データのサイクルか何かである可能性があると思ったので、次のコードをすべて試しました。

[userA addFollowersObject:userB];
[userB addFollowingObject:userA];

[userB addFollowersObject:userA];
[userA addFollowingObject:userB];

[userA addFollowersObject:userA];
[userA addFollowingObject:userA];

[userB addFollowingObject:userB];
[userB addFollowersObject:userB];

...しかし、保存は常に有効でした。最後に考えられるのはマルチスレッドです。ManagedObjectContext にアクセスしている複数のスレッドを使用していますか? その場合、データに矛盾が生じ、エラーが発生する可能性があります。

于 2013-03-13T07:48:31.177 に答える
1

Userとを含むモデル定義の詳細を教えていただければ助かりますFollowers。これは推測ですが、あなたの逆はfollowers間違っていますか?

User defined の関係は次のようになると思います。

M followers    User    following

フォロワーの関係は次のように定義されます。

M following    User    followers
于 2013-03-09T22:15:16.510 に答える