-3

これがコードです。誰かが理由を見つけることができますか?このプログラムは、友人のアルバムの写真を表示するためのものです。

このプログラムはFacebookAPIを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 に答える