gpt4 book ai didi

ios - 解析消息传递应用程序,需要找到一种方法来延迟代码执行,直到 deleteAllInBackground 执行完毕。包含详细代码

转载 作者:行者123 更新时间:2023-11-29 02:20:57 25 4
gpt4 key购买 nike

由于我的代码存在一些问题,我正在使用 Parse 框架构建一个简单的消息传递系统。我需要以某种方式延迟方法的调用,直到后台进程完成执行。代码如下。首先,我将 UIViewController 注册为解析推送通知的观察者。当收到推送时,将调用方法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完成再调。任何帮助将不胜感激。在这里兜圈子!谢谢

最佳答案

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

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

关于ios - 解析消息传递应用程序,需要找到一种方法来延迟代码执行,直到 deleteAllInBackground 执行完毕。包含详细代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28146140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com