Ios 等待从另一个类启动的线程-目标C

Ios 等待从另一个类启动的线程-目标C,ios,objective-c,Ios,Objective C,我遇到了无法解决的线程问题。我想在某个类中的一个单独线程上执行大约12000个对象的大型核心数据保存操作,并在另一个类中控制与完成保存操作相关的按钮操作。在这方面最好的方法是什么 以下是保存操作的外观: Class A -(void) saveAsync { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^

我遇到了无法解决的线程问题。我想在某个类中的一个单独线程上执行大约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
    }
这是我按钮上的动作方法(现在还不是什么)

我要求一个解决方案,让我知道,如果对象保存在一个按钮按下。我提供的代码只是一个表达想法的原始示例,我不希望它能像那样工作。我曾想过使用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 {
    }
}