4

私はこれまでのところ大ヒットを証明しているFlickrNetc#ライブラリを使用しています。

しかし、私には1つの問題があります。ユーザーIDのすべての写真を取得できますが、別のAPI呼び出しを行わないと、特定の写真が属するセット名を取得できません。この別の呼び出しは、私に大きなパフォーマンスの問題を与えています。ホームページは40枚の画像をロードするのに30秒かかります。これは増加するだけです。

画像を表示するために同位体を使用しているので、各写真のセット名を取得する必要があります。

私は単にAPIから画像を取得し、それらをリピーターにバインドしています。

これが私のコードです。

C#

Flickr f = FlickrManager.GetAuthInstance();
    protected void Page_Load(object sender, EventArgs e)
    {
        string userID = f.PeopleFindByEmail("me@yahoo.com").UserId;

        PhotoSearchOptions options = new PhotoSearchOptions
                                         {
                                             UserId = userID,
                                             Extras = PhotoSearchExtras.AllUrls | PhotoSearchExtras.Description | PhotoSearchExtras.Tags,
                                             SortOrder = PhotoSearchSortOrder.Relevance,
                                         };

        var photos = f.PhotosSearch(options);

        rptPhotos.DataSource = photos;
        rptPhotos.DataBind();
    }

    protected string GetSetNameForImageID(string imageID)
    {
        var sets = f.PhotosGetAllContexts(imageID).Sets;
        return sets[0].Title.ToLower().Replace(" ", "-");            
    }

HTML

<asp:Repeater runat="server" ID="rptPhotos">
    <ItemTemplate>
        <section class="<%# GetSetNameForImageID( Convert.ToString( Eval("PhotoID") ) ) %> item">
        <%--<a href="@Url.Action("Image", "Home", new {id = item.PhotoId})">--%>
        <a href="/View.aspx?pid=<%# DataBinder.Eval(Container.DataItem, "PhotoID") %>">
            <div>
                <div class="item_hover">
                    <header>         
                        <span>D</span>
                        <%--<p title="@item.Description" class="tiptip">_</p>  --%>
                        <p title="<%# DataBinder.Eval(Container.DataItem, "Description") %>" class="tiptip">_</p>  
                        <hgroup>
                            <%--<h2>@item.Title</h2>
                            <h3>@item.Tags[0]</h3>--%>

                            <h2><%# DataBinder.Eval(Container.DataItem, "Title") %></h2>
                            <h3><%# DataBinder.Eval(Container.DataItem, "Tags[0]") %></h3>
                        </hgroup>
                    </header>
                </div>
                <%--<img src="@item.Small320Url" alt="Video sit amet consectetur" />--%>
                <img src="<%# DataBinder.Eval(Container.DataItem, "Small320Url") %>" alt="Video sit amet consectetur" />
            </div>
        </a>
    </section>
    </ItemTemplate>
</asp:Repeater>

GetSetNameForImageIDとそれに続くAPI呼び出しなしで、各画像のセット名を取得するより迅速な方法はありますか?

4

1 に答える 1

3

について私が気づいたことの1つは、使用しPhotosGetAllContextsているSetsプロパティがオブジェクトのコレクションであり、オブジェクトのコレクションがaとaContextSetを格納していることです。PhotoSetIdTitle

PhotosetsGetListメソッドとPhotosetsGetPhotosメソッドを組み合わせるのはどうですか?この2つを使用して、このメソッドで現在発生しているオーバーヘッドを回避できると思います。PhotosGetAllContexts

免責事項:テストされていないコード。

var photoSets = f.PhotosetsGetList(userId);
Dictionary<string, List<Photo>> photoSetPhotoMap = new Dictionary<string, List<Photo>>();

foreach (var photoSet in photoSets)
{
    var photoSetPhotos = f.PhotosetsGetPhotos(photoSet.PhotosetId,
        PhotoSearchExtras.AllUrls | PhotoSearchExtras.Description | PhotoSearchExtras.Tags);

    photoSetPhotoMap.Add(photoSet.PhotosetId, photoSetPhotos.ToList());
}

var photos =
    from kvp in photoSetPhotoMap
    from photo in kvp.Value
    select new
    {
        SetTitle = kvp.Key, PhotoId = photo.PhotoId, Description = photo.Description,
        PhotoTitle = photo.Title, Tags = photo.Tags[0], Small320Url = photo.Small320Url
    };

rptPhotos.DataSource = photos;
rptPhotos.DataBind();

このアプローチで発生する主な問題は、ページングを効果的に実装することだと思います。フォトセットのサイズによっては(NumberOfPhotosプロパティによって決定できます)、フォトセットの途中でページが途切れるシナリオに遭遇する可能性があります。

これを解決するには、NumberOfPhotosプロパティを使用して写真の総数を計算し、ページサイズにページ番号を掛けてPhotoSets、リクエストを満たすために必要な写真の数と数を計算することをお勧めします。

于 2013-02-19T09:10:52.307 に答える