簡體   English   中英

在Core Data Loaded Swift之后異步刷新UITableView

[英]Refreshing UITableView Asynchronously after Core Data Loaded Swift

我有一個UITableView, tViewNews

我有一個刷新功能,從我的服務器下載數據,將其存儲到核心數據,然后表視圖從核心數據加載這些數據。

它完美地運作

func refresh(refreshControl: UIRefreshControl) {

    self.newsArray = [NewsItem]()
    self.newslists = [[NewsItem]]()
    self.getNewsFromServer()
    self.getNewsFromCoreData()
    self.tViewNews.reloadData()

    refreshControl.endRefreshing()
}

現在,當用戶首次打開新聞viewDidLoad() ,我希望表視圖首先從核心數據加載,然后從服務器異步填充我的表視圖數組(使用與刷新函數完全相同的方法)和然后重新加載表視圖。

所以我在viewDidLoad()函數中嘗試了以下代碼。

override func viewDidLoad() {
    super.viewDidLoad()

    // Getting news from Core Data
    getNewsFromCoreData()

    // Updating core data from server and populating table view from core data
    dispatch_async(dispatch_get_main_queue()) {

        self.newsArray = [NewsItem]()
        self.newslists = [[NewsItem]]()
        self.getNewsFromServer()
        self.getNewsFromCoreData()
        self.tViewNews.reloadData()

    }

如您所見,在異步請求中運行的函數與刷新函數內的函數相同。

但是!,刷新功能正常運行,填充並重新加載表視圖。 但異步請求絕對沒有任何作用。 表格視圖仍為空。 但正如使用print語句測試的那樣,函數正在運行。

任何人都知道為什么會這樣嗎?

編輯 - 增加了額外的功能

獲取核心數據

func getNewsFromCoreData() {
    let temp = StaffCoreData()
    temp.getAllNews()

    newsDates = Dictionary<Int, [NewsItem]>()

    for newsobj in temp.newsArray{

        if var curdate = newsDates[toNewsItem(newsobj).age]{

            curdate.append(toNewsItem(newsobj))
            newsDates[toNewsItem(newsobj).age] = curdate


        }else{

            newsDates[toNewsItem(newsobj).age] = [toNewsItem(newsobj)]

        }
    }

    for var i = 0; i<50; ++i{if let curdate = newsDates[i]{newslists.append(curdate)}}

獲取服務器數據

使用以下方法運行實例:

func NewsCallReturnsWithSuccess(data: NSData) {

    if let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) {
        if let statusesArray = jsonObject as? NSArray{

            newsArray.removeAll(keepCapacity: true)

            for item in statusesArray {
                let datacon : NSData = item.dataUsingEncoding(NSUTF8StringEncoding)!
                let jsonObject : NSDictionary! = NSJSONSerialization.JSONObjectWithData(datacon, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary

                let title : NSString = jsonObject.objectForKey("title") as! NSString
                let content : NSString = jsonObject.objectForKey("content") as! NSString
                let publishedby : NSString = jsonObject.objectForKey("publishedby") as! NSString
                let modified : NSString = jsonObject.objectForKey("modified") as! NSString
                let imageurl : NSString = jsonObject.objectForKey("imageurl") as! NSString
                let category : NSString = jsonObject.objectForKey("category") as! NSString

                let newsItem = NewsItem(title: title as String, content: content as String, category: category as String, imageURL: imageurl as String, publishedBy: publishedby as String, modified: modified as String)

                newsArray.append(newsItem)
                }

            //add complete array to CoreData
            let temp = StaffCoreData()
            temp.addArrayOfNew(newsArray)

        }

    }

}

當您使用不同的線程來加載數據時,必須在完成加載后返回主線程以更新UI。

喜歡:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        // load data
        dispatch_async(dispatch_get_main_queue()) {
            // update ui
        }
    }

UPDATE

請向我們展示你的getNewsFromCoreData()getNewsFromServer()方法,也許你的cellForRowAtIndexPath

override func viewDidLoad() {
    super.viewDidLoad()

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        // load data
        self.newsArray = [NewsItem]()
        self.newslists = [[NewsItem]]()
        self.getNewsFromServer()
        self.getNewsFromCoreData()
        dispatch_async(dispatch_get_main_queue()) {
            // update ui
            self.tViewNews.reloadData()
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM