Игнорировать «Не удалось вызвать назначенный инициализатор в классе NSManagedObject

#objective-c #core-data #nsmanagedobject

#objective-c #core-data #nsmanagedobject

Вопрос:

Основная база данных отслеживает информацию о пользователе. Цель состоит в том, чтобы войти в систему, используя core data, достаточно просто. Имитация приложения и вход в систему работают отлично. Xcode не показывает никаких ошибок или предупреждений.

Вывод консоли показывает: не удалось вызвать назначенный инициализатор в классе NSManagedObject «Login» Могу ли я игнорировать этот вывод??

Login.h и Login.m создаются самим Xcode из модели данных.

Login.h

 #import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class User;

@interface Login : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * password;
@property (nonatomic, retain) User *user;

  (User *)loginWithEmail:(NSString *)email withPassword:(NSString *)password inManagedObjectContext:(NSManagedObjectContext *)context;

@end
  

Login.m

 #import "Login.h"
#import "User.h"

@interface Login ()
- (User *)isValidEmail:(NSString *)email inManagedObjectContext:(NSManagedObjectContext *)context;
@end

@implementation Login
@dynamic password;
@dynamic user;

- (User *)isValidEmail:(NSString *)email inManagedObjectContext:(NSManagedObjectContext *)context
{
    User *user = nil;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    request.entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
    request.predicate = [NSPredicate predicateWithFormat:@"email = %@", email];

    NSError *error = nil;
    user = [[context executeFetchRequest:request error:amp;error] lastObject];
    [request release];

    return user;
}

  (User *)loginWithEmail:(NSString *)email withPassword:(NSString *)password inManagedObjectContext:(NSManagedObjectContext *)context
{
    Login *loginHelper = [[Login alloc] init];
    User *user = nil;

    if ((user = [loginHelper isValidEmail:email inManagedObjectContext:context])) {
        if ([user.login.password isEqualToString:password]) {
            // correct login
        } else {
            // invalid password
            user = nil;
        }
    } else {
        // user does not exist
        user = nil;
    }

    [loginHelper release];
    return user;
}

@end
  

Ответ №1:

Насколько я понимаю, вы обычно не выделяете / инициализируете NSManagedObjects или подклассы NSManagedObjects явно — CoreData обрабатывает создание экземпляров и освобождение управляемых объектов по мере необходимости — но вы пытаетесь выделить / инициализировать свой собственный подкласс в своем методе loginWithEmail. Так что, вероятно, поэтому вы получаете ошибку.

В более широком смысле эта реализация, похоже, стирает границы между тем, что должно быть моделью данных (ваш подкласс NSManagedObject), и логикой приложения «входа в систему», поэтому я бы рекомендовал немного пересмотреть вашу архитектуру, чтобы более точно отразить принципы model-view-controller! Счастливого кодирования.

Комментарии:

1. Теперь я вижу ошибку. На данный момент я ввел это в логин, поскольку это было быстрое и грязное кодирование, последует рефакторинг 🙂 Мне нужен helperLogin для доступа к методу экземпляра isValidEmail:inManagedObjectContext: мне действительно придется пересмотреть свою архитектуру. Спасибо!

2. Просто взглянул на документацию Apple для NSManagedObject — если вы посмотрите на примечания к подклассам: «Важно: этот метод является назначенным инициализатором для NSManagedObject. Вы не должны инициализировать управляемый объект, просто отправив его init «.