SaveContext несколько раз внутри executeBlock - PullRequest
0 голосов
/ 18 октября 2018

У меня есть поток, в котором я должен создать объект и сохранить его в CoreData.Но по потоку мне нужно обновлять объект каждые X секунд и обновлять его, сохраняя контекст.А поскольку существует возможность завершения приложения в coredata, должна быть «последняя обновленная версия» объекта.Проблема в том, что после сохранения контекста данные ядра больше не сохраняются.Пример с двойным сохранением не работает:

dispatch_semaphore_t waitTodoA = dispatch_semaphore_create(0);
NSManagedObjectContext *contextA = [CoreDataManager backgroundObjectContext];
[contextA performBlock:^{

    PlaceObject* placeObject  = [NSEntityDescription insertNewObjectForEntityForName:@"Places" inManagedObjectContext:contextA];
    placeObject.type = @"Flat";
    placeObject.timestamp = [[NSDate date] timeIntervalSince1970];
    [CoreDataManager saveContext:contextA];

    placeObject.address = @"Sunny beach ave. 1";
    placeObject.coordinates = @"0.0,0.0";
    [CoreDataManager saveContext:contextA];

    dispatch_semaphore_signal(waitTodoA);
}];
dispatch_semaphore_wait(waitTodoA, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)));

1 Ответ

0 голосов
/ 18 октября 2018

ОК, я понимаю, что вы пытаетесь проверить сейчас.Ответ в том, что у меня это отлично работает.Я вставил следующий код в конец -readFromURL::: в подклассе документа моего приложения Core Data на основе документов:

[self.managedObjectContext performBlock:^{
    Stark* stark = [NSEntityDescription insertNewObjectForEntityForName:@"Stark_entity"
                                                 inManagedObjectContext:self.managedObjectContext];

    BOOL ok ;
    NSError* error = nil;
    NSLog(@"Testing two saves in %@", self);

    stark.name = @"David";
    stark.rating = @(3);
    ok = [self.managedObjectContext save:&error];
    NSLog(@"First Save ok=%hhd error = %@", ok, error);

    stark.url = @"http://example.com";
    stark.comments = @"Did it work?";
    ok = [self.managedObjectContext save:&error];
    NSLog(@"Second Save ok=%hhd error = %@", ok, error);
}];

После запуска этого кода NSLogs напечатало:

Testing two saves in BkmxDoc 0x100d308f0 "Test.bmco"
First Save ok=1 error = (null)
Second Save ok=1 error = (null)

И, изучив файл SQLite, я обнаружил, что новый объект действительно был вставлен и имел все четыре значения свойств, назначенных приведенным выше кодом.

Я согласен с @vadian, что там используется dispatch_semaphoreстранно, хотя я не вижу причин, по которым сбой может привести к сбережению.Просто чтобы доказать, что в последующем тесте я добавил эти три строки, используя dispatch_semaphore, повторно протестировал, и он все еще работал.

Наиболее вероятным источником проблемы является использование CoreDataManager.Обратите внимание, что в моем коде я просто использовал raw `- [NSManagedObjectContext save:].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...