使用离线存储时禁用用户交互
user interaction was disabled when using offline storage
我已将我的 json 响应存储在 NSUserdefaults 中,我必须显示存储的响应,即使数据处于离线状态,结果也正常
但 ui 的用户交互在离线时被禁用。
希望有人能帮忙
我已经尝试在网络可达性已连接或未连接时给出断点,它正在进入循环并显示响应,但 ui 交互被触发
func homePageAPI()
{
let kUserDefault = UserDefaults.standard
if Reachability.isConnectedToNetwork() == true{
APIModel().homeApi(withUrl: "", withParameters:"", withComplitionBlock: {(_ responseDict: Dictionary!, _ error:String) -> Void in// here im not displaying my url as it is illegal
DispatchQueue.main.async (execute:{ () -> Void in
if (responseDict != nil)
{
kUserDefault.set(responseDict, forKey: "responseDict")
self.productresponseArray = (responseDict["server_productresponse"] as AnyObject) as! NSArray
self.productDetailsArray = ((responseDict["server_productresponse"] as AnyObject) .value(forKey: "product_dtls") as AnyObject) as! NSArray
self.vehicleStatusStringArray = ((responseDict["server_productresponse"] as AnyObject) .value(forKey: "veh_status") as AnyObject) as! NSArray
}
})
})
}
else{
let offlineResponseDict:NSDictionary = kUserDefault.value(forKey: "responseDict") as! NSDictionary
print(offlineResponseDict as Any)
self.productresponseArray = (offlineResponseDict["server_productresponse"] as AnyObject) as! NSArray
self.productDetailsArray = ((offlineResponseDict["server_productresponse"] as AnyObject) .value(forKey: "product_dtls") as AnyObject) as! NSArray
self.vehicleStatusStringArray = ((offlineResponseDict["server_productresponse"] as AnyObject) .value(forKey: "veh_status") as AnyObject) as! NSArray
}
self.homeTableView.reloadData()
}
为什么要在主线程设置变量?这是不必要的,可能会锁定您的视图,这可能会让人觉得用户交互已被禁用。在主线程上做任何与 UI 无关的事情都应该立即改变。代码中唯一应该在主线程上的部分是重新加载函数。
试试这个:
func homePageAPI() {
let kUserDefault = UserDefaults.standard
DispatchQueue.global(qos: .background).async {
// do something that needs to be run on background thread
if Reachability.isConnectedToNetwork() {
APIModel().homeApi(withUrl: "", withParameters:"", withComplitionBlock: {
(_ responseDict: Dictionary!, _ error:String) -> Void in// here im not displaying my url as it is illegal
if (responseDict != nil)
{
kUserDefault.set(responseDict, forKey: "responseDict")
self.productresponseArray = (responseDict["server_productresponse"] as AnyObject) as! NSArray
self.productDetailsArray = ((responseDict["server_productresponse"] as AnyObject) .value(forKey: "product_dtls") as AnyObject) as! NSArray
self.vehicleStatusStringArray = ((responseDict["server_productresponse"] as AnyObject) .value(forKey: "veh_status") as AnyObject) as! NSArray
}
})
} else{
let offlineResponseDict:NSDictionary = kUserDefault.value(forKey: "responseDict") as! NSDictionary
print(offlineResponseDict as Any)
self.productresponseArray = (offlineResponseDict["server_productresponse"] as AnyObject) as! NSArray
self.productDetailsArray = ((offlineResponseDict["server_productresponse"] as AnyObject) .value(forKey: "product_dtls") as AnyObject) as! NSArray
self.vehicleStatusStringArray = ((offlineResponseDict["server_productresponse"] as AnyObject) .value(forKey: "veh_status") as AnyObject) as! NSArray
}
// update UI on main thread
DispatchQueue.main.async {
self.homeTableView.reloadData()
}
}
}
我已将我的 json 响应存储在 NSUserdefaults 中,我必须显示存储的响应,即使数据处于离线状态,结果也正常 但 ui 的用户交互在离线时被禁用。 希望有人能帮忙
我已经尝试在网络可达性已连接或未连接时给出断点,它正在进入循环并显示响应,但 ui 交互被触发
func homePageAPI()
{
let kUserDefault = UserDefaults.standard
if Reachability.isConnectedToNetwork() == true{
APIModel().homeApi(withUrl: "", withParameters:"", withComplitionBlock: {(_ responseDict: Dictionary!, _ error:String) -> Void in// here im not displaying my url as it is illegal
DispatchQueue.main.async (execute:{ () -> Void in
if (responseDict != nil)
{
kUserDefault.set(responseDict, forKey: "responseDict")
self.productresponseArray = (responseDict["server_productresponse"] as AnyObject) as! NSArray
self.productDetailsArray = ((responseDict["server_productresponse"] as AnyObject) .value(forKey: "product_dtls") as AnyObject) as! NSArray
self.vehicleStatusStringArray = ((responseDict["server_productresponse"] as AnyObject) .value(forKey: "veh_status") as AnyObject) as! NSArray
}
})
})
}
else{
let offlineResponseDict:NSDictionary = kUserDefault.value(forKey: "responseDict") as! NSDictionary
print(offlineResponseDict as Any)
self.productresponseArray = (offlineResponseDict["server_productresponse"] as AnyObject) as! NSArray
self.productDetailsArray = ((offlineResponseDict["server_productresponse"] as AnyObject) .value(forKey: "product_dtls") as AnyObject) as! NSArray
self.vehicleStatusStringArray = ((offlineResponseDict["server_productresponse"] as AnyObject) .value(forKey: "veh_status") as AnyObject) as! NSArray
}
self.homeTableView.reloadData()
}
为什么要在主线程设置变量?这是不必要的,可能会锁定您的视图,这可能会让人觉得用户交互已被禁用。在主线程上做任何与 UI 无关的事情都应该立即改变。代码中唯一应该在主线程上的部分是重新加载函数。
试试这个:
func homePageAPI() {
let kUserDefault = UserDefaults.standard
DispatchQueue.global(qos: .background).async {
// do something that needs to be run on background thread
if Reachability.isConnectedToNetwork() {
APIModel().homeApi(withUrl: "", withParameters:"", withComplitionBlock: {
(_ responseDict: Dictionary!, _ error:String) -> Void in// here im not displaying my url as it is illegal
if (responseDict != nil)
{
kUserDefault.set(responseDict, forKey: "responseDict")
self.productresponseArray = (responseDict["server_productresponse"] as AnyObject) as! NSArray
self.productDetailsArray = ((responseDict["server_productresponse"] as AnyObject) .value(forKey: "product_dtls") as AnyObject) as! NSArray
self.vehicleStatusStringArray = ((responseDict["server_productresponse"] as AnyObject) .value(forKey: "veh_status") as AnyObject) as! NSArray
}
})
} else{
let offlineResponseDict:NSDictionary = kUserDefault.value(forKey: "responseDict") as! NSDictionary
print(offlineResponseDict as Any)
self.productresponseArray = (offlineResponseDict["server_productresponse"] as AnyObject) as! NSArray
self.productDetailsArray = ((offlineResponseDict["server_productresponse"] as AnyObject) .value(forKey: "product_dtls") as AnyObject) as! NSArray
self.vehicleStatusStringArray = ((offlineResponseDict["server_productresponse"] as AnyObject) .value(forKey: "veh_status") as AnyObject) as! NSArray
}
// update UI on main thread
DispatchQueue.main.async {
self.homeTableView.reloadData()
}
}
}