UI 更新缓慢 *仅* 如果调用以响应 NSURLSessionUploadTask 完成块中发生的更改

UI Slow to Update *ONLY* If Called In Response To Change Occurring in NSURLSessionUploadTask Completion Block

该应用程序与我服务器上的 php 脚本交互。用户可以创建预订,并将详细信息写入数据库。随后,他们可以取消该预订。

在应用程序中,预订是一个对象,负责从服务器收集自己的详细信息。预订也可以自行取消(根据用户的请求)——在 BookingViewController 中按 "the cancel button" 调用预订的 (void)cancelBooking 方法,该方法使用带有 [=71 的 NSURLSessionUploadTask 发布到 bookings-cancel.php =] 数据从 @{ @"invoiceNumber": self.invoiceNumber }.

滚动

数据库已更新,uploadSession returns 新的详细信息,预订也会相应更新。所有这一切都非常灵敏 - 在不到一秒的时间内始终如一地起起落落。

当我尝试使用从预订对象读取的值更新 BookingViewController 上的 UI(交货日期和价格标签)时出现问题 之后它已经更新了自身(在 uploadSession 完成块内)。

BookingViewController 被指定为预订的代理。预订是为 KVO 自行设置的 "price" 属性。每当价格发生变化时,预订都会在 BookingViewController 上调用委托方法 priceDidChange:(NSString *)updatedPrice,触发 NSLog 并更新到 deliveryLabel.textpriceLabel.text.

- (void)priceDidUpdate:(NSString *)updatedPrice {
    NSLog(@"priceDidUpdate delegate notification - updatedPrice is: %@", updatedPrice);
    [self.deliveryLabel setText:@"N/A"];
    [self.priceLabel setText:updatedPrice];
}

测试表明,如果我直接从 "cancel" 按钮或使用 [=22= 中的任何其他明确命令(例如 self.price = @"123.45")更新价格] 方法 在 uploadTask 之外,然后 UI 更新与写出 NSLog 一样快(即接近瞬时)。

但是,如果价格在 uploadTask 完成块 内更新,NSLog 将同样响应地写出 但更新到 deliveryLabel.text和 priceLabel.text 发生的速度非常慢 - 延迟大约在 5 到 12 秒之间变化。

我已经 NSLogs 到处都是,我相信这不仅仅是关于从预订对象获取更新值的延迟。我已经轻松地看到了二十次“priceDidUpdate delegate notification - updatedPrice is: 0.00”(更新后的价格),然后在 self.priceLabel.text 实际设置为 @"0.00" 之前计数到 10。完全难住了。

以防万一,NSURLSession 使用 ephemeralSessionConfiguration 配置,无需任何调整。

根据对 priceDidChange 的调用是来自 uploadTask 完成块内部还是外部,BookingViewController 中的 UI 更新是否需要更长时间才能发生? ?

提前致谢!

使用主队列更新UI。使用以下代码:

- (void)priceDidUpdate:(NSString *)updatedPrice 
{
    dispatch_async(dispatch_get_main_queue(), ^()
    {
            //Add method, task you want perform on mainQueue
            //Control UIView, IBOutlet all here
            NSLog(@"priceDidUpdate delegate notification - updatedPrice is: %@", updatedPrice);
            [self.deliveryLabel setText:@"N/A"];
            [self.priceLabel setText:updatedPrice];
    });
}