-3

这是代码。谁能找到原因?该程序用于显示朋友相册中的照片。

我认为这个程序使用了 facebook api 3 次,所以可能有重点。但我对事情没有任何想法,而不是这段代码。

  graph = Koala::Facebook::API.new(session[:access_token])
  freegraph = Koala::Facebook::API.new

  friends = graph.get_object("me/friends")
  friendsIds = Array.new
  friends.each do |f| friendsIds << f["id"] end
  fsinfo = freegraph.get_objects(friendsIds)

  @realFriends = Array.new
  fsinfo.each do |f|
    if f[1]["gender"].present? && (f[1]["gender"] != "male")
      @realFriends << f[1]
    end
  end

  rFids = @realFriends.map do |rF| rF["id"] end

  albums = graph.get_object("albums?ids="+rFids.join(","))
  album_ids = Array.new
  albums.each do |user|
     album_ids += user[1]["data"].map do |a| a["id"] end
  end

  randAlbumIds = Array.new
  20.times do
    randAlbumIds << album_ids.at(rand(album_ids.count))
  end

  imgList = graph.get_object("photos?ids="+randAlbumIds.join(","))
  imgObjs = Array.new
  imgList.each do |img|
    imgObjs += img[1]["data"]
  end
  if params[:tags].present?
    @photos = imgObjs.select do |i| i["tags"].present? end
  else
    @photos = imgObjs
  end
4

1 回答 1

3

Facebook 的拉动速度会很慢,这是理所当然的。您不想在 Rails HTTP 请求中进行 HTTP 调用——这也是给定的。因此,您需要将其移至后台进程或线程。

但我更关心你的代码......你写的

 @realFriends = Array.new
  fsinfo.each do |f|
    if f[1]["gender"].present? && (f[1]["gender"] != "male")
      @realFriends << f[1]
    end
  end

  rFids = @realFriends.map do |rF| rF["id"] end

你正在寻找一系列女性朋友的想法。所以我会这样做:

@female_friend_ids = fsinfo.map {|friend| friend["id"] if friend.first["gender"] != "male"}.compact

这将返回一组非男性朋友 ID。该地图将返回 [nil, 3435, 656],并摆脱我们称为紧凑的 nil。

它是可读的,并且执行速度会更快并减少垃圾收集时间。

无法自拔。更多的!

randAlbumIds = Array.new
20.times do
  randAlbumIds << album_ids.at(rand(album_ids.count))
end

应该只是

random_album_ids = album_ids.shuffle.take(20)

(这一切都只是 Ruby 的魅力)

于 2012-07-24T13:00:31.793 回答