如何等待Parse deleteAllInBackground调用完成?

时间:2015-01-22 15:51:22

标签: ios parse-platform

我正在使用Parse的框架构建一个简单的消息传递应用程序。我有一个名为displayMessages的方法。每次手机接到推送时都会调用此方法。

但是,由于此消息在Parse数据库中正在工作,所以如果它已经在运行,我不想再次调用它。我想等到它完成然后再打电话。

我使用以下代码:

-(void)receivedPush
{

    [self displayMessages];

}

和:

-(void)displayMessages
{
 //code here
}

如果收到push被叫,我希望它等到displayMessages完成后再调用它。在displayMessages我有一个Parse调用:

[PFObject deleteAllInBackground:toDelete block:^(BOOL succeeded, NSError *error) {

                    }];

实际上,我需要等待,deleteAllInBackground。我怎么能绕过这个?我尝试使用NSOperation队列,这对于排队displayMessages很好,但这不会给我的应用程序提供所需的结果,因为虽然displayMessages在某些时候完成执行但它仍然运行deleteAllInBackground

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您的要求是您只需要一次运行一个displayMessages“实例”。你要做的是使displayMessages“threadsafe”你应该做的是将代码包装在@synchronized标签内的displayMessages中。

What does @synchronized() do?

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html

或者,您可以创建某种使用标志的排队系统,因此recievedPush实际上会将推送添加到队列中,并且会有某种定时器循环重复调用显示消息,但只会在触发时触发已完成处理。

编辑以回复评论 创建一个手动“操作队列”,它可以完成您想要的操作

- (void) methodThatRunsWhenFiredByTimer {
    if (self.flag) {
        [self displayMessages];
    }
}

- (void) displayMessages {
    PushData *data = [self dequeueData]; //maybe, not sure how you're accessing the push data
    self.flag = NO;
    //Code Here
    [PFObject deleteAllInBackground:toDelete block:^(BOOL succeeded, NSError *error) {
        //Code Here...
        self.flag = YES;
    }];
}

- (void) recievedPush:(Pushdata) data {
    [self enqueuePushData:data];
}