解析消息传递应用程序,需要找到一种方法来延迟代码执行,直到 deleteAllInBackground 执行完毕。包含详细代码
Parse messaging app, need to find a way to delay code execution until deleteAllInBackground finishes executing. Detailed code included
我的代码存在一些问题,我正在使用 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。消息库是一个 class,其中包含指向消息 class 实例的用户名。每条消息都放在一个数组中并显示为 UIAlertView(这只是临时的,用于测试目的)。
代码正常运行,但存在一个大问题,如果收到推送通知并收到消息,然后调用 displayMessages [PFObject deleteAllInBackground:toDelete]; 在后台运行,因此如果消息接收得太快,程序将显示重复的消息,因为它们尚未完成删除。我需要做的是在允许调用 displayMessages 之前等待 deleteAllInBackground 完成。我已经尝试使用 NSOperations 队列,但这没有帮助,因为如果 displayMessages 在队列中,即使后台删除仍然是 运行,它也会被视为完成。无论如何我可以解决这个问题吗?只需要displayMessages等到deleteAllInBackground完成再调。任何帮助将不胜感激。在这里兜兜转转!谢谢
您应该使用 deleteAllInBackground:block:
以便知道删除何时完成。
你的 NSOperationQueue
建议很好,但你需要做一些工作来创建一个持续 'running' 的操作,直到所有异步处理结束为止。有一些指南,例如 this one.
您应该做的是向消息对象添加一个布尔字段 "Displayed",说明消息是否显示,并将显示的消息标记为 true。
然后在您的演示循环中,跳过已经显示的消息,并在您的删除功能中删除所有标记的消息。
您的问题是同步显示和删除消息。我不明白你写的查询 - 当你在 displayMessages 方法中删除消息时,它很混乱!
像我在
中建议的那样,将显示消息和删除消息分开,并在它们之间创建依赖关系
您需要重新设计您的解决方案。
我的代码存在一些问题,我正在使用 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。消息库是一个 class,其中包含指向消息 class 实例的用户名。每条消息都放在一个数组中并显示为 UIAlertView(这只是临时的,用于测试目的)。
代码正常运行,但存在一个大问题,如果收到推送通知并收到消息,然后调用 displayMessages [PFObject deleteAllInBackground:toDelete]; 在后台运行,因此如果消息接收得太快,程序将显示重复的消息,因为它们尚未完成删除。我需要做的是在允许调用 displayMessages 之前等待 deleteAllInBackground 完成。我已经尝试使用 NSOperations 队列,但这没有帮助,因为如果 displayMessages 在队列中,即使后台删除仍然是 运行,它也会被视为完成。无论如何我可以解决这个问题吗?只需要displayMessages等到deleteAllInBackground完成再调。任何帮助将不胜感激。在这里兜兜转转!谢谢
您应该使用 deleteAllInBackground:block:
以便知道删除何时完成。
你的 NSOperationQueue
建议很好,但你需要做一些工作来创建一个持续 'running' 的操作,直到所有异步处理结束为止。有一些指南,例如 this one.
您应该做的是向消息对象添加一个布尔字段 "Displayed",说明消息是否显示,并将显示的消息标记为 true。 然后在您的演示循环中,跳过已经显示的消息,并在您的删除功能中删除所有标记的消息。
您的问题是同步显示和删除消息。我不明白你写的查询 - 当你在 displayMessages 方法中删除消息时,它很混乱!
像我在
您需要重新设计您的解决方案。