在TableView

时间:2015-12-21 19:02:07

标签: ios json swift uitableview

我正在尝试解析一个大的JSON文件(大约1000行包含8个字符串的元组)并在UITableView中显示。我已经有的工作,但我正在寻找一种更有效的方式来显示它们。

目前我的代码看起来像这样:

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(data:data!)),然后在实际填充数组时,我使用包含两个属性的类(一个用于表中的主文本和一个细节文本)

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方式不是正确的方法,但我想也许我忽略了一些东西。

3 个答案:

答案 0 :(得分: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]
    }
}

您可能已经注意到数组追加方法的不寻常语法。这是因为制作你的阵列&#34;可观察&#34;是解决方案的一部分。我建议您使用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 :(得分:0)

您不应该担心必须在TableView中显示多少数据。 只要您将json对象作为Tablesource正确传递,TableView类就会为您处理所有事情。

答案 2 :(得分:0)

实际上,您对如何使用资源非常关注。通常情况下,如果您不想从请求中查询全部数据,我们将使用分页。然后,您将基于skiplimit实现一些适当的逻辑,以获得更多数据。

对于UITableView,没有什么可担心的。因为,它以有效的方式发展。内存中单元格的总数是可见单元格的总数。 UITableView将通过委派方法帮助填充数据。它不是:你有500行数据,然后它有500 UITableViewCell。它是可重用的。