При сохранении NSArray в трансформируемом атрибуте Core Data объект не будет доступен для доступа при последующем извлечении его объекта. Однако после этого он доступен для любой выборки. Что происходит?Основные данные Transformable Attributes (NSArray) пустые
Я могу установить и сохранить объект Core Data и его атрибуты из одного места в моем приложении iOS. Затем я читаю последний сохраненный объект. Доступны все атрибуты, кроме трансформируемых NSArrays. По какой-то причине массивы отображаются как пустые (при печати в журнале это выглядит так: route = "(\n)"
.Если приложение закрывается и затем снова открывается, атрибут больше не пуст. Любые идеи?
Я понимаю, что сохранение NSArray к трансформируемому атрибуту не лучшая практика. не могли бы вы объяснить, почему это происходит?
Update 1
NSArray заполнен объектами CLLocation.
На консоли отсутствуют ошибки или предупреждения. Они также не содержат никаких предупреждений или ошибок компилятора.
Update 2
Ниже приводится XCTest я написал для этого вопроса. Тест не прерывается до самого последнего утверждения (как и ожидалось).
- (void)testRouteNotNil {
// This is an example of a performance test case.
NSMutableArray *route;
for (int i = 0; i < 500; i++) {
CLLocation *location = [[CLLocation alloc] initWithLatitude:18 longitude:18];
[route addObject:location];
}
NSArray *immutableRoute = route;
// Save the workout entity
// Just use placeholder values for the XCTest
// The method below works fine, as the saved object exists when it is fetched and no error is returned.
NSError *error = [self saveNewRunWithDate:@"DATE01" time:@"TIME" totalSeconds:100 distance:[NSNumber numberWithInt:100] distanceString:@"DISTANCE" calories:@"CALORIES" averageSpeed:[NSNumber numberWithInt:100] speedUnit:@"MPH" image:[UIImage imageNamed:@"Image"] splits:route andRoute:immutableRoute];
XCTAssertNil(error);
// Fetch the most recently saved workout entity
RunDataModel *workout = [[[SSCoreDataManager sharedManager] fetchEntityWithName:@"Run" withSortAttribute:@"dateObject" ascending:NO] objectAtIndex:0];
XCTAssertNotNil(workout);
// Verify that the fetched workout is the one we just saved above
XCTAssertEqual(workout.date, @"DATE01");
// Check that the any non-NSArray object stored in the entity is not nil
XCTAssertNotNil(workout.distance);
// Check that the route object is not nil
XCTAssertNotNil(workout.route);
}
Update 3
Как вы можете видеть ниже, это как базовая модель данных является установка в Xcode. Выбран атрибут маршрута. Обратите внимание, что я пробовал это как с временным свойством, так и без него. Нужно ли добавлять Value Transformer Name
, что это?
Update 4
Сам код для управления основными данными исходит из моего GitHub репо, SSCoreDataManger (который хорошо работает, насколько мне известно).
Вот saveNewRunWithDate
метод:
- (NSError *)saveNewRunWithDate:(NSString *)date time:(NSString *)time totalSeconds:(NSInteger)totalSeconds distance:(NSNumber *)distance distanceString:(NSString *)distanceLabel calories:(NSString *)calories averageSpeed:(NSNumber *)speed speedUnit:(NSString *)speedUnit image:(UIImage *)image splits:(NSArray *)splits andRoute:(NSArray *)route {
RunDataModel *newRun = [[SSCoreDataManager sharedManager] insertObjectForEntityWithName:@"Run"];
newRun.date = date;
newRun.dateObject = [NSDate date];
newRun.time = time;
newRun.totalSeconds = totalSeconds;
newRun.distanceLabel = distanceLabel;
newRun.distance = distance;
newRun.calories = calories;
newRun.averageSpeed = speed;
newRun.speedUnit = speedUnit;
newRun.image = image;
newRun.splits = splits; // This is also an issue
newRun.route = route; // This is an issue
return [[SSCoreDataManager sharedManager] saveObjectContext];
}
И ниже является RunDataModel
NSManagedObject Интерфейс:
/// CoreData model for run storage with CoreData
@interface RunDataModel : NSManagedObject
@property (nonatomic, assign) NSInteger totalSeconds;
// ...
// Omitted most attribute properties because they are irrelevant to the question
// ...
@property (nonatomic, strong) UIImage *image;
/// An array of CLLocation data points in order from start to end
@property (nonatomic, strong) NSArray *route;
/// An array of split markers from the run
@property (nonatomic, strong) NSArray *splits;
@end
В реализации этих свойств могут быть сконфигурированы с использованием @dynamic
Что содержится в массиве? Какие объекты? – quellish
@quellish Пожалуйста, ознакомьтесь с моим обновленным вопросом. NSArray заполнен объектами CLLocation. –
Вы сохранили/зафиксировали свой контекст? вы получаете доступ к нему из одного потока? – nielsbot