parsing消息应用程序,需要find一种方法来延迟代码执行,直到deleteAllInBackground完成执行。 包括详细的代码
与我的代码有一些问题,我正在使用Parse框架构build一个简单的消息传递系统。 我需要以某种方式延迟方法的调用,直到后台进程完成执行。 代码如下。 首先,我将UIViewController注册为Parse Push Notification的观察者。 当收到一个推送被调用的方法receivedPush 。 收到推送然后调用displayMessages 。
- (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedMessage) name:@"receivedPush" object:nil]; } -(void)receivedMessage { [self displayMessages]; } -(void)displayMessages { //here I want to cycle through the message objects NSMutableArray *toDelete = [[NSMutableArray alloc] init]; PFQuery *messageBankQuery = [PFQuery queryWithClassName:@"messageBank"]; [messageBankQuery whereKey:@"username" equalTo:[PFUser currentUser].username]; [messageBankQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if(!error) { PFObject *messageBank = objects[0]; PFRelation *receivedMessages = [messageBank relationForKey:@"receivedMessages"]; PFQuery *receivedMessagesQuery = [receivedMessages query]; [receivedMessagesQuery orderByAscending:@"createdAt"]; [receivedMessagesQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if((!error) &&([objects count]>0)) { for(PFObject *message in objects) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Push!" message:miao[@"username"] delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil]; [alert show]; //add to the delete items array [toDelete addObject:message]; } if([toDelete count]>0) { //delete all using the array, single API call [PFObject deleteAllInBackground:toDelete]; } }//end if }];//end receivedMessagesQuery } }];//end messageBankQuery }
在displayMessages中 ,程序首先查询messageBank。 消息库是一个包含指向消息类实例的用户名的类。 每个消息放在一个数组中,并显示为一个UIAlertView(这只是暂时的,用于testing目的)。
代码的function,因为它应该,但有一个大问题,如果一个推送通知接收和receivedMessages,然后displayMessages被称为[PFObject deleteAllInBackground:toDelete]; 在后台运行,所以如果收到的消息太快,程序将显示重复的消息,因为他们还没有完成删除。 我需要做的是等待deleteAllInBackground完成,然后让displayMessages被调用。 我曾尝试使用NSOperations队列,但这并没有帮助,因为如果displayMessages在队列中,它将计数完成,即使后台删除仍在运行。 无论如何,我可以解决这个问题吗? 只需要displayMessages等待,直到deleteAllInBackground完成才能完成重新调整。 任何帮助将不胜感激。 在这里绕圈! 谢谢
您应该使用deleteAllInBackground:block:
以便知道删除完成的时间。
你的NSOperationQueue
build议是一个很好的build议,但是你需要做一些工作来创build一个继续运行的操作,直到所有的asynchronous处理完成。 有几个指南,像这个 。
你应该做的是在消息对象中添加一个布尔字段“Displayed”,指出是否显示消息,并标记显示为true的消息。 然后在您的演示文稿循环中,跳过已显示的消息,并在删除function中删除所有标记的消息。
你的问题是同步显示和删除消息。 我不明白你写的查询 – 当你在displayMessages方法中删除消息时,这是令人困惑的!
保持显示消息和删除消息分开,并创build它们之间的依赖关系,如我在Concurrent NSOperationbuild议, 以及如何设置isFinished和isExecuting?
您需要重新构build您的解决scheme。