我正在尝试解析一个大的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
方式不是正确的方法,但我想也许我忽略了一些东西。
答案 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)
实际上,您对如何使用资源非常关注。通常情况下,如果您不想从请求中查询全部数据,我们将使用分页。然后,您将基于skip
和limit
实现一些适当的逻辑,以获得更多数据。
对于UITableView
,没有什么可担心的。因为,它以有效的方式发展。内存中单元格的总数是可见单元格的总数。 UITableView
将通过委派方法帮助填充数据。它不是:你有500行数据,然后它有500 UITableViewCell
。它是可重用的。