2015-12-21 27 views
0

處理大型文件的JSON我試圖解析一個大的JSON文件(約:1000行方含8個字符串的元組),並在UITableView顯示這一點。我已經有的工作,但我正在尋找一種更有效的方式來顯示它們。在TableView中

目前我的代碼看起來很喜歡這樣的:,然後當它涉及到實際填充陣列我使用的是:

public func GET(request: String, callback: (result: JSON?, response: NSHTTPURLResponse?, error: NSError?) -> Void) { 
    let session = NSURLSession.sharedSession() 
    let url = NSURL(string : "SOMEURL") 
    let task = session.dataTaskWithURL(url!){ 
     (data, response, error) -> Void in 

     if error != nil { 
      callback(result: nil, response: response as? NSHTTPURLResponse, error: error!) 
     } else { 
      callback(result: JSON(data : data!), response: response as? NSHTTPURLResponse, error: nil) 
     } 
    } 
    task.resume() 
} 

這不使用SwiftJSON(!數據)看到JSON(數據)解析數據含有兩個屬性(一個用於在表中的主文本,一個用於詳細文本)

class SomeClass { 
    let MainText : String 
    let DetailText : String 

    init(MainText : String, DetailText : String) { 
     self.MainText = MainText 
     self.DetailText = Detailtext 
    } 
} 

類現在在UITableView我有一個.swift文件,並在

override func ViewDidLoad() { 
    //code 
} 

我使用一個循環從GET方法的結果回調獲取數據追加到

var rows : [SomeClass] = [] 

數組,這是非常CPU密集型的,但我沒有找到另一種方式來處理這個問題。我試着只在表格中顯示50行,只爲行創建50個類的項目。但沒有的事項,我擔心的是,處理這個問題的方式SwiftyJSON不正確的,但我想,也許我忽視的東西。

回答

0

你不應該擔心你有多少數據在TableView中顯示。 只要您正確傳遞json對象作爲Tablesource,TableView類就可以處理所有的事情。

0

它實際上是關於你如何使用資源相當不錯的關注。通常情況下,如果您不想從請求中查詢全部數據量,我們將使用分頁。然後,您將根據skiplimit實施一些適當的邏輯,以獲取更多數據。

至於UITableView,沒有什麼可擔心的。因爲它是以有效的方式開發的。內存中的單元總數是可見單元的總數。 UITableView將通過委託方法幫助填充數據。這不是:你有500行數據,那麼它有500 UITableViewCell。它是可重用的。

1

如果我明白你的問題,你是擔心CPU /能源效率。

如果不是應用程序已經有效,你應該考慮的是在後臺線程中實現解析過程,讓你的[SomeClass]數組可視化,並在表發生變化時更新表(也就是當背景解析添加了新的價值)。

所以首先要在後臺(與Async GCD包裝爲例)運行分析功能:

func callback(JSON?, response: NSHTTPURLResponse, error: NSError?) { 
    Async.background { 
     //Do your JSON parsing stuff here, XXX is a SomeClass object 
     rows <- rows + [XXX] 
    } 
} 

你可能已經注意到了陣列的方法追加不尋常的語法。這是因爲讓你的數組「可觀察」是解決方案的一部分。我建議您獲取Observable-Swift庫以便於觀察。

一旦添加到您的項目,改變你的數組聲明:

var rows = Observable([SomeClass]()) 

現在實行的時候你的回調(在你的viewDidLoad:例如)解析一個新的項目,將被調用的方法

rows.afterChange += { self.table.reloadData() } 

其中table是你的表格視圖

如果你想實現一個電源友好的運行時,你可能想更新每次將50或100個對象添加到該數組時,該表格都會被添加。這可以這樣做(如果你想這樣做不正確的實現上述方法):

rows.afterChange += { if $1.count/100 = 1 { self.table.reloadData() }} 

其中100是所需的新對象的值,以便更新表添加。使用Observable-Swift,$ 0表示數組更新之前的數組,$ 1數組更新後的數組。

最後一件事:rows陣列不再是[SomeClass]類型,而是Observable<SomeClass>。如果你想訪問[SomeClass]的值,只需將rows替換爲rows.value

希望我沒有誤解你的問題。無論如何,如果我這樣做,我認爲這仍然可以幫助提供更好的JSON解析實現。

+1

我認爲這個負擔必須推到後端。儘管你正在做這樣的事情,那麼大量的數據仍然在內存中。有選擇地查詢數據應該是最好的方法。 –