我有一个UITableViewController,而我遇到的问题是NoMethodError' length'对于nil类 - 因为@data是[]否则在不同的上下文中调用时返回行,如何在tableview尝试加载数据之前确保从远程服务加载数据?
def viewDidLoad
super
loaddata
end
def loaddata
@data = ().to_a
AFMotion::Client.shared.get("api/v1/user") do |response|
if response.success?
d = response.object["user"]
d.each {
|item|
aitem = item.new(item)
@data << aitem
}
end
end
end
def tableView(table_view, numberOfRowsInSection: section)
@data.length //error here
end
答案 0 :(得分:0)
这将是(快速解决方案)
def tableView(table_view, numberOfRowsInSection: section)
loaddata unless @data
@data.length //error here
end
或者(更像红宝石的解决方案,但需要更多重构):
将loaddata方法更改为:
def loaddata
result = []
AFMotion::client.shared.get("api/v1/user") do |response|
if response.success?
result = response.object["user"].map { |item| item.new(item) }
end
end
result
end
定义新方法:
def data
@data ||= loaddata
end
现在使用data
代替@data
。它将确保每次首次调用loaddata
时调用data
,它将缓存该调用的结果。
更多要点:
命名约定 - 在ruby中我们使用snakecase作为方法和变量,因此table_view
代替tableView
AFMotion::client
- 我很难解析。 client
是一个模块方法(那么应该是AFMotion.client
),还是一个模块/类(应该是AFMotion::Client
)