Подождите, когда поток запущен из другого класса - Objective C

Я столкнулся с проблемой нити, которую я не могу решить. Я хочу выполнить большую операцию сохранения основных данных около 12000 объектов в отдельном потоке в определенном классе, а в другом классе - управлять действием кнопки в связи с завершением операции сохранения. Каков наилучший подход к этому?

Вот как выглядит операция сохранения:

Class A

 -(void) saveAsync
 {
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
 {
 //arrayOfObjects holds the 12000 objects

 for(aClass *object in arrayOfObjects)
 {
 [self saveToCoreData: object];
 }

 NSLog(@"Finished saving");

 });
 }

 -(void) saveToCoreData : (aClass *) object
 {
 //perform save operation here
 }

И это метод действия на моей кнопке (которая на самом деле еще ничего)

Class B

 -(********) buttonActionMethod
 {
 //take different actions depending on the objects being persisted to the store or still saving
 }

Я прошу решение, которое позволит мне узнать, сохранены ли объекты при нажатии кнопки. Код, который я предоставил, является лишь сырым примером для выражения идеи, я не ожидаю, что она будет работать так. Я думал об использовании NSOperationQueue или создании потоков или использования групп, но я не нашел решение, которое работает.

Заранее спасибо!

2 ответа

Вы можете подписаться на NSManagedObjectContextDidSaveNotification:

Отправляется всякий раз, когда контекст управляемого объекта завершает операцию сохранения.

Объектом оповещения является контекст управляемого объекта. Словарь userInfo содержит следующие ключи: NSInsertedObjectsKey, NSUpdatedObjectsKey и NSDeletedObjectsKey.

Я настоятельно рекомендую НЕ использовать любые переменные класса, поскольку они хранят состояние класса, которое не является его частью


Вам необходимо сохранить BOOL на классе A, который укажет состояние сохранения, и проверьте, что BOOL из класса B, и выполните различные действия.

>> Class A

 @property (atomic) BOOL isSaving;

- (void)saveAsync
{
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {
 //arrayOfObjects holds the 12000 objects
 self.isSaving = YES;
 for(aClass *object in arrayOfObjects) {
 [self saveToCoreData:object];
 }
 self.isSaving = NO;
 NSLog(@"Finished saving");
 });
}

- (void)saveToCoreData:(aClass *)object
{
 //perform save operation here
}



>> Class B

- (********)buttonActionMethod
{
 // take different actions depending on the objects being persisted to the store or still saving
 if (classA.isSaving) {
 } else {
 }
}

licensed under cc by-sa 3.0 with attribution.