加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – Swift异步数据显示滞后

发布时间:2021-08-28 03:43:46 所属栏目:大数据 来源: https://www.jb51.cc
导读:我从服务器(我通过一些PHP Web服务访问的MysqL数据库)获取异步数据时遇到了一些困难.我的代码如下: func RetreiveStaff() { SetProgramMode() self.astrUsers = [String]() self.pkvUser.reloadAllComponents() if self.booCurrentDataVersion == true { va

我从服务器(我通过一些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)@H_502_19@

解决方法:

在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, 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()
        }
    }
}

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读