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のインスタンス変数を、エンドポイントが返す配列に設定して、テーブルビューにデータを入力できるようにします。

viewDidLoadで実行しようとしています@data = Person.get_peopleが、代わりに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

ここで何が欠けていますか?このデータをバブルラップの応答オブジェクトから取得して、コントローラーに渡すために使用可能な形式にするにはどうすればよいですか?

4

2 に答える 2

3

BWのドキュメントで説明されているように、「BW :: HTTPはNSURLRequest、NSURLConnection、およびその仲間をラップして、Ruby開発者に使い慣れた使いやすいAPIを提供します。APIは非同期呼び出しとブロックを使用して、可能な限りシンプルに保ちます。」

呼び出しの非同期性により、2番目のスニペットでは、実際に更新する前に@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 に答える