4

我正在使用 FlickrNet c# 库,该库迄今为止被证明是一个巨大的成功。

但是,我有一个问题。我可以获取用户 ID 的所有照片,但如果不进行另一个 api 调用,我无法获取特定照片所属的集合名称。这个单独的电话给我带来了巨大的性能问题。主页需要 30 秒才能加载 40 张图片。这只会增加。

当我使用同位素显示图像时,我需要为每张照片设置名称。

我只是从 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

我注意到的一件事PhotosGetAllContextsSets您正在使用的属性是ContextSet对象的集合,这些对象又存储 aPhotoSetId和 a Title

PhotosetsGetListPhotosetsGetPhotos方法结合起来怎么样?我认为您可以使用这两个来避免您当前使用该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 回答