我正在使用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
。
答案 0 :(得分:0)
如果我理解正确,您的要求是您只需要一次运行一个displayMessages“实例”。你要做的是使displayMessages“threadsafe”你应该做的是将代码包装在@synchronized标签内的displayMessages中。
或者,您可以创建某种使用标志的排队系统,因此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];
}