3

我正在尝试 Rubymotion,但似乎无法弄清楚如何完成看似简单的任务。

我已经为人员目录设置了 UITableView。我创建了一个返回 json 的 rails 后端。

Person 模型定义了一个 get_people 类方法:

def self.get_people
  BubbleWrap::HTTP.get("http://myapp.com/api.json") do |response|
    @people = BW::JSON.parse(response.body.to_str)
    # p @people prints [{"id"=>10, "name"=>"Sam"}, {etc}] to the console
  end
end

在 directory_controller 中,我只想将 @data 的实例变量设置为我的端点返回的数组,以便我可以填充表视图。

我正在尝试@data = Person.get_people在 viewDidLoad 中执行操作,但收到一条错误消息,指示正在传递 BW 响应对象:undefined methodcount' for #BubbleWrap::HTTP::Query:0x8d04650 ...> (NoMethodError)`

因此,如果我在 BW 响应块之后将数组硬编码到 get_people 方法中,一切正常。但是我发现我也无法通过关闭 BW 响应块来保留实例变量。

def self.get_people
  BubbleWrap::HTTP.get("http://myapp.com/api.json") do |response|
    @people = BW::JSON.parse(response.body.to_str)
  end
  p @people #prints nil to the console
  # hard coding [{"id"=>10, "name"=>"Sam"}, {etc}] here puts my data in the table view correctly
end

我在这里想念什么?如何从bubblewrap 的响应对象中获取这些数据并以可用的形式传递给我的控制器?

4

2 回答 2

3

正如 BW 文档中所解释的那样,“BW::HTTP 包装了 NSURLRequest、NSURLConnection 和朋友,为 Ruby 开发人员提供了更熟悉和更易于使用的 API。API 使用异步调用和块来保持尽可能简单。”

由于调用的异步性质,在您的第二个片段中,您在实际更新之前打印@people。正确的方法是在解析结束后将新数据传递给 UI(例如,如果 @people 数组应该显示在 UITableView 中,则为 @table.reloadData())。

这是一个例子:

def get_people
    BubbleWrap::HTTP.get("http://myapp.com/api.json") do |response|
        @people  = BW::JSON.parse(response.body.to_str)
        update_result()
    end
end

def update_result()
    p  @people
    # do stuff with the updated content in @people
end

在使用 BubbleWrap 的RubyMotion 异步编程中找到更复杂的用例和更详细的解释

于 2012-10-10T20:25:41.123 回答
0

就个人而言,我会跳过 BubbleWrap 并去做这样的事情:

def self.get_people
  people = []
  json_string = self.get_json_from_http
  json_data = json_string.dataUsingEncoding(NSUTF8StringEncoding)
  e = Pointer.new(:object)
  hash = NSJSONSerialization.JSONObjectWithData(json_data, options:0, error: e)
  hash["person"].each do |person| # Assuming each of the people is stored in the JSON as "person"
    people << person
  end
  people # @people is an array of hashes parsed from the JSON
end

def self.get_json_from_http
  url_string = ("http://myapp.com/api.json").stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
  url = NSURL.URLWithString(url_string)
  request = NSURLRequest.requestWithURL(url)
  response = nil
  error = nil
  data = NSURLConnection.sendSynchronousRequest(request, returningResponse: response, error: error)
  raise "BOOM!" unless (data.length > 0 && error.nil?)
  json = NSString.alloc.initWithData(data, encoding: NSUTF8StringEncoding)
end
于 2012-11-09T09:42:22.380 回答