首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将作为字符串(BubbleWrap表示RubyMotion)

将作为字符串(BubbleWrap表示RubyMotion)
EN

Stack Overflow用户
提问于 2012-11-07 17:23:00
回答 2查看 422关注 0票数 0

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

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

实际上,我只想让twitter_search_results返回response.body.to_str,但我不知道如何做到这一点。

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-08 16:55:20

下面是完整的控制器代码。我还把GitHub项目

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2012-11-07 18:07:31

这里的问题是异步性。我想,您已经快到了,但是create_tweets方法不是在puts @tweets之前调用的。在这种情况下,我建议使用通知,因为我认为它们很好;-)

代码语言:javascript
复制
TweetsReady = 'TweetsReady'  # constants are nice
NSNotificationCenter.defaultCenter.postNotificationName(TweetsReady, object:@tweets)

In your controller, register for this notification in `viewWillAppear` and unregister in `viewWillDisappear`

NSNotificationCenter.defaultCenter.addObserver(self, selector: 'tweets_ready:', name: TweetsReady, object:nil)  # object:nil means 'register for all events, not just ones associated with 'object'
# ...
NSNotificationCenter.defaultCenter.removeObserver(self, name:TweetsReady, object:nil)

您的tweets_ready方法应该实现您的UI更改。

代码语言:javascript
复制
def tweets_ready(notification)
  @table.reloadData
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13274884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档