Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以字符串形式获取HTTP响应正文(RubyMotion的BubbleWrap)_Http_Twitter_Rubymotion - Fatal编程技术网

以字符串形式获取HTTP响应正文(RubyMotion的BubbleWrap)

以字符串形式获取HTTP响应正文(RubyMotion的BubbleWrap),http,twitter,rubymotion,Http,Twitter,Rubymotion,使用RubyMotion(这是第一次!),我想使用Twitter的搜索API为一些用户检索一些最近的推文,所以我把下面的类放在一起 tweets的值始终为空数组。我怀疑BW::HTTP.get(url)产生了自己的线程,这导致了问题 真的,我只想twitter\u search\u results返回response.body.to\u str,但我不知道怎么做 如何使用RubyMotion(或BubbleWrap)将Tweet对象数组放入UIViewController? class Twee

使用RubyMotion(这是第一次!),我想使用Twitter的搜索API为一些用户检索一些最近的推文,所以我把下面的类放在一起

tweets
的值始终为空数组。我怀疑
BW::HTTP.get(url)
产生了自己的线程,这导致了问题

真的,我只想
twitter\u search\u results
返回
response.body.to\u str
,但我不知道怎么做

如何使用RubyMotion(或BubbleWrap)将Tweet对象数组放入UIViewController?

class TweetsController
  def initialize
    @twitter_accounts = %w(dhh google)
    @tweets = []
  end

  def tweets
    twitter_search_results
    puts @tweets.count
    @tweets
  end

  def create_tweets(response)
    BW::JSON.parse(response)["results"].each do |result|
      @tweets << Tweet.new(result)
    end
  end

  def twitter_search_results
    query = @twitter_accounts.map{ |account| "from:#{account}" }.join(" OR ")
    url = "http://search.twitter.com/search.json?q=#{query}"
    BW::HTTP.get(url) do |response|
      create_tweets(response.body.to_str)
    end
  end
end

class TwitterViewController < UIViewController
  def viewDidLoad
    super
    self.view.backgroundColor = UIColor.blueColor
    @table = UITableView.alloc.initWithFrame(self.view.bounds)
    self.view.addSubview @table
    @table.dataSource = self
    @tweets_controller = TweetsController.new
  end

  def initWithNibName(name, bundle: bundle)
    super
    self.tabBarItem = UITabBarItem.alloc.initWithTitle(
      "Twitter",
      image: UIImage.imageNamed('twitter.png'),
      tag: 1)
    self
  end

  def tableView(tableView, numberOfRowsInSection: section)
    @tweets_controller.tweets.length
  end

  def tableView(tableView, cellForRowAtIndexPath: indexPath)
    @reuse_id = "Tweet"
    cell = UITableViewCell.alloc.initWithStyle(UITableViewCellStyleDefault, reuseIdentifier:@reuse_id)
    cell.textLabel.text = @tweets_controller.tweets[indexPath.row].text
    return cell
  end
end

class Tweet
  attr_reader :created_at, :from_user, :text
  def initialize(tweet_result)
    @created_at = tweet_result["created_at"]
    @from_user = tweet_result["from_user"]
    @text = tweet_result["text"]
  end
end
类TweetsController
def初始化
@twitter_帐户=%w(dhh谷歌)
@tweets=[]
结束
def推特
推特搜索结果
puts@tweets.count
@推特
结束
def创建_推文(响应)
BW::JSON.parse(response)[“results”]。每个do | result|

@tweets这里的问题是异步性。我想你就快到了,但是
create\u tweets
方法在
put@tweets
之前没有被调用。在这种情况下,我建议使用通知,因为我认为它们很好;-)

而且,您的tweets_ready方法应该实现您的UI更改

def tweets_ready(notification)
  @table.reloadData
end

完整的控制器代码如下。我还把

类TweetsController
def初始化
@twitter_帐户=%w(dhh谷歌)
@tweets=[]
创建推文
结束
def推特
@推特
结束
def创建_推文
json\u data=twitter\u search\u results.dataUsingEncoding(NSUTF8StringEncoding)
e=指针。新建(:对象)
dict=NSJSONSerialization.JSONObjectWithData(json_数据,选项:0,错误:e)
dict[“results”]。每个都有结果|
体育成绩班
p结果
@tweets 0&&error.nil?)
json=NSString.alloc.initWithData(数据,编码:NSUTF8StringEncoding)
结束
结束

如果遇到障碍,请在“rubymotion”停下来,并在那里打电话给我。:-)我发现有趣的是,解决方案是不使用BW::HTTP。在你看来,它丢失的阻止HTTP请求是一个bug吗,@colinta?我已经修复了我的答案-Mike的答案如下,他避开了BW::HTTP而支持NSURLRequest和family。我建议使用通知,我的原始答案在上面。我强烈不同意Mike对我的答案所做的非常自由的编辑。回答你关于缺失功能是一个bug的问题:我不会称之为bug,但它是一个缺失的功能。但是BuffelCube开发者是一个活跃的群体,并且可能接受或考虑——一个增加这个特性的拉请求!最后:我强烈反对使用阻塞请求。我认为异步请求是一件好事,我们应该通过编程来支持它们,而不是试图避免它们。好了,我做完了:-)
def tweets_ready(notification)
  @table.reloadData
end
class TweetsController
  def initialize
    @twitter_accounts = %w(dhh google)
    @tweets = []
    create_tweets
  end

  def tweets
    @tweets
  end

  def create_tweets
    json_data = twitter_search_results.dataUsingEncoding(NSUTF8StringEncoding)
    e = Pointer.new(:object)
    dict = NSJSONSerialization.JSONObjectWithData(json_data, options:0, error: e)
    dict["results"].each do |result|
      p result.class
      p result
      @tweets << Tweet.new(result)
    end
  end

  def twitter_search_results
    query = @twitter_accounts.map{ |account| "from:#{account}" }.join(" OR ")
    url_string = "http://search.twitter.com/search.json?q=#{query}"
    url_string_escaped = url_string.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
    url = NSURL.URLWithString(url_string_escaped)
    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
end