#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 «.