IBAction只调用一次时重复的POST请求

时间:2013-12-02 03:17:45

标签: ios objective-c post ibaction

我有一个连接到UIButton的IBAction,当按下它时会调用HTTPS POST请求方法。调用该方法并发出请求,服务器响应,一切都很花哨。

我遇到的问题非常奇怪。我启动了应用程序,然后点击了我的按钮。请求一次。我再次点击它,请求发出两次,我再次点击它并且请求触发三次,依此类推。我只需按一下按钮即可完成20个POST请求!

我设置断点以查看该方法是否被多次调用,并且断点仅显示一个。但是,然后我输入一个日志来记录请求,这表明它正在重复,但原因不明。

我没有循环(我可以看到),没有NSTimers,或者没有任何理由发生这种情况。这是连接到按钮的IBAction:

- (IBAction)startDrill:(id)sender
{
    chosenDict = startDict;
    [self submitDrillControl];
    NSLog(@"now");
}

这是它设置的NSDictionary:

    startDict = [NSDictionary dictionaryWithObjectsAndKeys:personID,@"person", selectedDrillID,@"drill", @"start",@"action", nil];

这是POST方法

- (void)submitDrillControl
{
    NSLog(@"1");

    NSError *error;
    NSData *jsonParams = [NSJSONSerialization dataWithJSONObject:chosenDict options:NSJSONWritingPrettyPrinted error:&error];

    NSString *paramString = [[NSString alloc] initWithData:jsonParams encoding:NSUTF8StringEncoding];

    NSString *bodyData = [NSString stringWithFormat:@"token=%@&method=drill_control&params=%@", savedToken, paramString];

    NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://my.url/"]];

    [postRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Field"];

    [postRequest setHTTPMethod:@"POST"];
    [postRequest setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] length:   [bodyData length]]];

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:postRequest delegate:self];

    NSLog(@"wtf? %@", postRequest);
    NSLog(@"Connection: %@", conn);
}

(如果有人想知道字典的用途,它包含我的API执行查询所需的参数。)

我不确定我应该发布的其他代码,或者是否需要任何其他代码,因为我真的不知道为什么会发生这种情况。如果我应该在这个问题中添加,删除或更改某些内容,请随时告诉我。

修改

所以经过一点挖掘(一旦我醒来),我发现上面的内容不是正在重复的POST请求。在此POST请求之后,服务器会收到一个触发NSNotification的响应。 NSNotification观察者调用的选择器是正在重复的POST请求。设置断点表明它会被多次调用。为什么通知会堆积?如何防止它被多次调用?

1 个答案:

答案 0 :(得分:1)

如果您使用基于块的NSNotification,则必须单独删除它们。将通知保存在ivar或属性中并明确删除。

我已经看到多次设置通知的位置,而不是被删除。然后每个实例都会触发;听起来这就是发生在你身上的事。

特别是removeObserver:nil ...不会删除基于块的观察者。