2014-09-25 2 views
0

У меня есть UITableViewController, и проблема, которую я получаю, это NoMethodError 'length' для класса nil, поскольку @data is [], которая в противном случае возвращает строки при вызове в другом контекст, как я могу гарантировать, что данные загружаются из удаленного сервиса, прежде чем таргетинг попытается загрузить его?Как обеспечить загрузку данных до того, как tableviewcontroller попытается загрузить его

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

является AFMotion :: клиента каким-то метод асинхронного который поддерживает обратный вызов? – nPn

ответ

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. именования - рубина мы используем snakecase для методов и переменных, так table_view вместо tableView

  2. AFMotion::client - это действительно трудно разобрать для меня. Является ли client методом модуля (то должно быть скорее AFMotion.client) или это модуль/класс (должно быть затем AFMotion::Client)

+0

спасибо, что вы меня туда предложили. Вы правы своим AFMotion :: Client, я обновлю – MikeW