【问题标题】:Parse messaging app, need to find a way to delay code execution until deleteAllInBackground finishes executing. Detailed code included解析消息应用程序,需要找到一种方法来延迟代码执行,直到 deleteAllInBackground 完成执行。包含详细代码
【发布时间】:2015-01-26 07:29:23
【问题描述】:

我的代码有一些问题,我正在使用 Parse 框架构建一个简单的消息传递系统。我需要以某种方式延迟方法的调用,直到后台进程完成执行。代码如下。首先,我将 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(这只是临时的,用于测试目的)。

代码按应有的方式运行,但存在一个大问题,即如果收到推送通知并收到消息,然后调用 displayMessages [PFObject deleteAllInBackground:toDelete]; 在后台运行,因此如果消息接收太快程序将显示重复的消息,因为它们尚未完成删除。我需要做的是等待 deleteAllInBackground 在允许调用 displayMessages 之前完成。我曾尝试使用 NSOperations 队列,但这无济于事,因为如果 displayMessages 在队列中,即使后台删除仍在运行,它也会被视为已完成。无论如何我可以解决这个问题吗?只需要 displayMessages 等到 deleteAllInBackground 完成后再重新调整。任何帮助将不胜感激。在这里兜兜转转!谢谢

【问题讨论】:

    标签: ios asynchronous parse-platform


    【解决方案1】:

    您应该使用deleteAllInBackground:block: 以便知道删除何时完成。

    您的NSOperationQueue 建议不错,但您需要做一些工作来创建一个继续“运行”的操作,直到所有异步处理结束为止。有一些指南,例如this one

    【讨论】:

    • 我可以使用 deleteAllInBackground:block 但这有什么帮助?我可以有一个标志变量,例如 BOOL isDeleting,并在块完成执行时将其设置为 NO,但问题是因为我正在使用 Push Notifications receivedMessages 可以随时调用,并且只调用一次。所以也许它被调用并且 isDeleting 是 YES。我从那里去哪里?只能考虑使用计时器并继续检查,直到该变量设置为 NO。但这似乎不是一个好方法。
    • 你考虑过使用操作队列,你可以,你只需要一次只执行一个操作,并让操作异步工作。
    • 我试过这个 NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(displayMessages) object:nil] 并将这段代码放在 receivedMessages 中。所以它排队而不是直接调用它。这将对 displayMessages 的调用排队,但它不等待 deleteAllInBackground 完成。即使 deleteAllinBackground 仍在运行,displayMessaged 也会完成执行。
    • 你读过我链接的文章吗?它有点过时,但描述了您需要遵循的操作过程。
    • 看一看。如果我创建一个并发操作,它有 _isExecuting 和 _isFinished 变量。这是真的?并且只有当 _isFinished 设置为 YES 时操作才会结束?
    【解决方案2】:

    您应该做的是向消息对象添加一个布尔字段“已显示”,说明消息是否显示,并将显示的消息标记为真。 然后在您的演示循环中,跳过已显示的消息,并在您的删除功能中删除所有标记的消息。

    【讨论】:

    • 将消息标记为显示或不显示需要 API 调用,但 saveInBackground:block。我会遇到同样的问题,演示循环正在运行,而 saveInBackground 可能仍在后台运行,修改布尔字段。
    • 如果保存更改太慢,例如我之前的方法太慢无法删除消息,则会显示重复项。
    • @kek 如果问题是出现重复项,那么您需要做的不是显示本地 toDelete 数组中已经存在的消息,然后随时删除它们,您不必等待删除结束。使它成为一个属性或其他东西,这样它就不会在 displayMessages 调用之间重置
    【解决方案3】:

    您的问题是同步显示和删除消息。我不明白你写的查询 - 当你在 displayMessages 方法中删除消息时,这很令人困惑!

    像我在Concurrent NSOperation and how to set isFinished and isExecuting? 中建议的那样,将显示消息和删除消息分开,并在它们之间创建依赖关系

    您需要重新设计您的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      相关资源
      最近更新 更多