在主线程上重新加载UITableView并不总是有效

时间:2015-08-19 12:04:17

标签: ios xcode multithreading swift uitableview

我遇到的问题是,当我在主队列上重新加载UITableView的数据时,它不会一直重新加载数据。当我启动应用程序并重新加载一些条纹(3到5次启动),然后一些不重载(2到3次启动)时,它只会大约在5次中重新加载数据。

我使用Swift 2在iOS 6和Xcode 7 Beta 4的iPhone 6上测试此应用。

这是我的UIViewController控件UITableView的代码,它也是启动后应用程序的初始屏幕。

import UIKit

class TableController: UIViewController, CLLocationManagerDelegate {
    let rowTitles = ["Date", "Temp", "Humidity", "Wind"]
    var tableData = [String : String]()

    override func viewDidLoad() {
        self.setupLocationManager()
    }

    func setupLocationManager() {

        // Setting up a location manager 

        self.locationManager.startUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        LocationData.ownLocation = locations.last!
        self.locationManager.stopUpdatingLocation()

        self.setupTable()
    }

    func setupTable() {
        ApiClient.getCurrentWeatherAndSunData(LocationData.ownLocation) { (data, error) -> Void in
            guard error == nil else {
                print("Could not get current weather and sun data")
                return
            }

            WeatherData.main = data!.valueForKey("main") as! Dictionary<String, AnyObject>
            WeatherData.wind = data!.valueForKey("wind") as! Dictionary<String, AnyObject>

            self.setWeatherData()

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.ownTableView.reloadData()
            })
        }
    }

    func setWeatherData() {
        let temp = String(WeatherData.main["temp"] as! Int)
        let humidity = String(WeatherData.main["humidity"] as! Int)
        let windSpeed = String(WeatherData.wind["speed"] as! Int)

        self.tableData["Date"] = getDateStringWithFormat(NSDate(), formatString: "dd.MM.yyyy")
        self.tableData["Temp"] = "\(temp)°"
        self.tableData["Humidity"] = "\(humidity)%"
        self.tableData["Wind"] = "\(windSpeed) km/h"
    }
}

extension TableController: UITableViewDataSource, UITableViewDelegate {
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.rowTitles.count ?? 0
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let myReuseIdentifier = "ReuseIdentifierPrayerTimes"
        var cell = tableView.dequeueReusableCellWithIdentifier(myReuseIdentifier) as UITableViewCell!

        if cell == nil {
            cell = UITableViewCell(style: UITableViewCellStyle.Value2, reuseIdentifier: myReuseIdentifier)
            cell.textLabel!.font = UIFont(name: cell.textLabel!.font.fontName, size: 17.0)
            cell.detailTextLabel!.font = UIFont(name: cell.detailTextLabel!.font.fontName, size: 17.0)
        }

        let rowTitle = self.rowTitles[indexPath.row]
        let rowData = self.tableData[rowTitle]

        cell!.textLabel!.text = rowTitle
        cell!.detailTextLabel!.text = rowData

        return cell
    }
}

问题在于,即使在主线程上调用reloadData()函数并在setWeatherData()中设置表的值后调用它,我的iPhone上的表也不会显示数据。

如果我这样做,表确实会显示数据并转到另一个标签并返回:

override func viewDidAppear() {
    self.ownTableView.reloadData()
}

我的问题是你是否能找到这种随机行为的原因。我假设在初始加载表之后reloadData()调用过快,因此被忽略。在应用程序启动后,如何组织API调用以及后续数据重新加载UITableView?

1 个答案:

答案 0 :(得分:0)

所以,问题是我在Xcode 7 Beta 4的Interface Builder(IB)中为我的UITableView添加了原型UITableViewCell。我不知道为什么,但是将原型UITableViewCell添加到IB中的UITableView会导致问题在所有UITableViews中。在我的IB项目中的UITableViews中再次删除原型UITableViewCells后,一切正常。这样我的代码在启动时会创建几个UITableViewCell,并在我更改数据并在UITableView上调用reloadData()时重用它们。