当我从表格视图中删除行时,如何停止执行选择器?

时间:2014-08-14 16:54:44

标签: ios objective-c uitableview performselector

我有一个应用程序,当您单击按钮时发送UDP消息。然后我给他们10秒钟改变他们是否想要发送消息的想法。我用:

[self performSelector:@selector(sendMessage:) withObject:_dataString afterDelay:10.0f];

按下按钮代码:

- (IBAction)RecordButton:(UIButton *)sender {
    NSString *Str = display.text;
    NSDateFormatter *clockFormat = [[NSDateFormatter alloc] init];
    [clockFormat setDateFormat:@"kk:mm:ss:SSS"];

    NSString *myT = [clockFormat stringFromDate:[NSDate date]];

    _dataString = [NSString stringWithFormat:@"0, %@, %@, \"%@\"", Str, Str, myT];

    [self performSelector:@selector(sendMessage:) withObject:_dataString afterDelay:10.0f];

    [_tableView reloadData];
}

- (void)sendMessage:(NSString *)message {
    NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];
    [udpSocket sendData:data toHost:ipSaved port:portSaved withTimeout:-1.0 tag:0];
}

我有一个可编辑的表视图,当我删除一个表视图单元格及其中的数据时,如果它在10秒的时间限制内,我想停止发送单元格中的数据。

我知道有[NSObject cancelPreviousPerformRequestsWithTarget:yourTarget selector:aSelector object: anArgument];,但我无法弄清楚如何在删除表格视图单元格及其中的核心数据后停止发送消息。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        [tableView beginUpdates];

        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(sendMessage:) object:_dataString];

        [self.managedObjectContext deleteObject:[self.getRaceRecords objectAtIndex:indexPath.row]];
        NSError *error;
        if (![self.managedObjectContext save:&error]) {
            NSLog(@"did not save: %@", [error localizedDescription]);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

(让我们假设所有内容都在主线程上运行,因此没有任何同步问题。)以下是我要做的事情:

  • 为每条消息分配唯一的序列号
  • 在创建消息时将序列号添加到NSSet
  • 时从NSSet中删除序列号

    a)消息被取消,或者是    b)发送消息

  • sendMessage方法中
  • ,验证序列号是否在 发送消息之前NSSet

答案 1 :(得分:0)

您应该查看NSOperationQueue并创建NSOperation的子类。 NSOperations可以取消 - 您必须编写一些代码来完成它,但它相当容易。并且NSOperations 意味着被取消。