我从服务器(我通过一些
PHP Web服务访问的MysqL数据库)获取异步数据时遇到了一些困难.我的代码如下:
func RetreiveStaff() { SetProgramMode() self.astrUsers = [String]() self.pkvUser.reloadAllComponents() if self.booCurrentDataVersion == true { var url:NSURL = NSURL(string: "http://www.website.com.au/retrievestaff.PHP")! let task:NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(url,completionHandler: { (data:NSData!,response:NSURLResponse!,error:NSError!) -> Void in if error == nil { let dataArray:[AnyObject] = NSJSONSerialization.JSONObjectWithData(data,options: NSJSONReadingOptions.MutableContainers,error: nil) as! [AnyObject] for data in dataArray { let dictionary:[String:String] = data as! [String:String] if dictionary["StaffID"] != nil { self.astrUsers.append(dictionary["LastName"]! + "," + dictionary["FirstName"]!) self.astrUserIDs.append(dictionary["StaffID"]!) self.pkvUser.reloadAllComponents() } self.pkvUser.reloadAllComponents() } } else { let actionSheet:UIAlertController = UIAlertController(title: "Connection Error",message: "\(strAppName) was unable to load data. Check you are connected to the internet and restart the app.",preferredStyle: UIAlertControllerStyle.Alert) let firstAlertAction:UIAlertAction = UIAlertAction(title: "OK",style: UIAlertActionStyle.Default,handler: { (alertAction:UIAlertAction!) in }) actionSheet.addAction(firstAlertAction) self.presentViewController(actionSheet,animated: true,completion: nil) } }) task.resume() } }
代码执行时,将按原样获取数据,但视图不会显示它.基本上,正如您所看到的,我抓取数据,将其放入数组中,然后重新加载我的pickerView(它使用数组作为其数据源).执行代码后,pickerView在约20秒内保持明显空白,然后突然出现.但是,如果用户在20秒内点击,拖动,更改pickerView等的值,则会显示数据.
根据我对问题的理解,这意味着数据被提取并放入pickerView,但视图没有正确地重新加载,尽管我的数量很多且可能是过多的self.pkvUser.reloadAllComponents().
我究竟做错了什么?
(我也检查过这些问题,但他们没有解决这个问题:
Swift: Asynchronous callback
Asynchronous Fetching Swift Xcode
iOS Swift: Displaying asynchronous data on a TableView)
解决方法
在IOS中显示任何视图应该始终在主线程中.
当您执行异步请求时,将结果从主线程推送到用户的视图,如下所示:
var someView : UIView = someAsyncCallBack.. dispatch_async(dispatch_get_main_queue()) { currentView.addSubview(someView); }
尝试这段代码,在异步请求完成后,处理主队列中的响应没有问题,这也解决了显示滞后问题
if error == nil { dispatch_async(dispatch_get_main_queue()) { let dataArray:[AnyObject] = NSJSONSerialization.JSONObjectWithData(data,error: nil) as! [AnyObject] for data in dataArray { let dictionary:[String:String] = data as! [String:String] if dictionary["StaffID"] != nil { self.astrUsers.append(dictionary["LastName"]! + "," + dictionary["FirstName"]!) self.astrUserIDs.append(dictionary["StaffID"]!) self.pkvUser.reloadAllComponents() } self.pkvUser.reloadAllComponents() } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。