Ios 等待从另一个类启动的线程-目标C
我遇到了无法解决的线程问题。我想在某个类中的一个单独线程上执行大约12000个对象的大型核心数据保存操作,并在另一个类中控制与完成保存操作相关的按钮操作。在这方面最好的方法是什么 以下是保存操作的外观:Ios 等待从另一个类启动的线程-目标C,ios,objective-c,Ios,Objective C,我遇到了无法解决的线程问题。我想在某个类中的一个单独线程上执行大约12000个对象的大型核心数据保存操作,并在另一个类中控制与完成保存操作相关的按钮操作。在这方面最好的方法是什么 以下是保存操作的外观: Class A -(void) saveAsync { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
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
}
这是我按钮上的动作方法(现在还不是什么)
我要求一个解决方案,让我知道,如果对象保存在一个按钮按下。我提供的代码只是一个表达想法的原始示例,我不希望它能像那样工作。我曾想过使用NSOperationQueue或创建线程或使用组,但还没有找到一个有效的解决方案
提前谢谢你 您需要在类a上存储一个BOOL,它将指示保存状态,
检查B类的BOOL,并采取不同的行动
>> 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
- (IBAction)buttonActionMethod
{
// take different actions depending on the objects being persisted to the store or still saving
if (classA.isSaving) {
} else {
}
}
您可以订阅
NSManagedObjectContextDidSaveNotification
:
每当托管对象上下文完成保存操作时发布
通知对象是托管对象上下文。用户信息
字典包含以下键:NSInsertedObjectsKey,
NSUpdatedObjectsKey和NSDeletedObjectsKey
我强烈建议不要使用任何类变量,因为它们存储的类状态不是类的真实部分最简单的方法可能是使用
NSNotificationCenter
发布通知,或者如果您想知道按下按钮时是否完成保存,完成保存时只需设置一个布尔值。保存完成后,我可以发布通知,但如何通过observer方法控制按钮操作,因为在操作结束之前不会发布通知,并且可以在操作结束之前点击按钮。将布尔属性存储在类B中,这首字母缩写为false。在类B中的notification observer方法中,只需将布尔值设置为true。仅当-(void)saveToCoreData:(aClass*)对象方法在由我的分派启动的同一线程上执行时,您的解决方案才适用,否则(我的情况就是这样)保存操作在其他线程上自行启动,迭代在对象实际保存之前完成。否,因为您可以在循环结束时发布通知,但在dispatch_async内,或者您可以从循环内部调用dispatch\u group\u async并使用dispatch group
我不认为您的解决方案会起作用,因为在每个对象保存时都会调用此方法,并且我必须跟踪数组中的对象数,这在类B中我不知道,还得把A班的东西存起来。可能我误解了,如果是的话,请纠正我。谢谢大家!@BogdanBalta事实上,每次当某些上下文保存时,它都会触发您的方法。我以为你有一次性导入,完成后可以取消订阅。无论如何,您可以检查[notification object],可能会help@NikitaTook我强烈建议您开始使用属性,通知将使您的代码成为地狱,另一个保存通知(NSManagedObjectContextDidSaveNotification)也会影响屏幕的逻辑您认为,保存
不是保存数据类的一部分,这真是太糟糕了。@l0gg3r classA可能不是只保存数据的类。它可以是任何类,在这种情况下,isSaving
不是一个属性。例如,Person
类可以保存自己的数据,但是Person.isSaving意味着什么呢?请参阅与Paulw11的讨论。谢谢你的回答。这个答案是正确的-你似乎认为每次调用[self-saveToCoreData]
发生在一个单独的线程上,但它不是-您正在一个单独的线程上调度整个for循环,尽管我会发布一个通知,建议保存已完成,而不是保留对类B中的类a实例的引用。
>> 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
- (IBAction)buttonActionMethod
{
// take different actions depending on the objects being persisted to the store or still saving
if (classA.isSaving) {
} else {
}
}