如何确保在tableviewcontroller尝试加载数据之前加载数据

时间:2014-09-25 12:05:06

标签: ruby rubymotion

我有一个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 

1 个答案:

答案 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,它将缓存该调用的结果。

更多要点:

  1. 命名约定 - 在ruby中我们使用snakecase作为方法和变量,因此table_view代替tableView

  2. AFMotion::client - 我很难解析。 client是一个模块方法(那么应该是AFMotion.client),还是一个模块/类(应该是AFMotion::Client