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.text
和 priceLabel.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];
});
}
该应用程序与我服务器上的 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.text
和 priceLabel.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];
});
}