我使用的是 FlickrNet c# 库,到目前为止证明它非常受欢迎。
但是,我遇到了一个问题。我可以获取用户 ID 的所有照片,但如果不进行另一个 api 调用,我无法获取特定照片所属的设置名称。这个单独的调用给我带来了巨大的性能问题。主页需要 30 秒来加载 40 张图片。这只会增加。
我需要为每张照片设置名称,因为我正在使用同位素来显示图像。
我只是从 api 中抓取图像并将它们绑定(bind)到转发器。
这是我的代码。
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 调用,有没有更快的方法来获取每个图像的设置名称?
最佳答案
我注意到关于 PhotosGetAllContexts
的一件事是您正在使用的 Sets
属性是 ContextSet
对象的集合,这些对象依次存储一个 PhotoSetId
和一个 Title
。
如何结合 PhotosetsGetList和 PhotosetsGetPhotos方法?我认为您可以使用这两个来避免您当前在使用 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
你需要得到满足请求。
关于c# - FlickrNet API - 从 PhotoSearch 获取集合名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14511768/