我在我的应用程序中使用 IKImageBrowserView,如果我在其上添加许多照片,应用程序将停止工作,并且在分析器中我看到分配的内存太高.. 我需要以某种方式对其进行优化。这是我的 BrowserItem :
public class BrowseItem : IKImageBrowserItem
{ // .....
public override NSString ImageRepresentationType {
get {
return IKImageBrowserItem.NSURLRepresentationType;
}
}
public override NSObject ImageRepresentation {
get {
return NSUrl.FromFilename (_path);
}
}
}
和数据来源:
public class BrowseData : IKImageBrowserDataSource
{
string _arrangeBy;
List<BrowseItem> images;
List<string> DateGroup { get; set; }
public override void Invoke (Action action, double delay)
{
base.Invoke (action, delay);
}
public BrowseData (string arrangeBy) : base ()
{
_arrangeBy = arrangeBy;
images = new List<BrowseItem> ();
}
public void FillItems (IEnumerable<BrowseItem> data)
{
if (data != null) {
switch (_arrangeBy) {
case "Month":
DateGroup = data.Select (x => x.Month).Distinct ().ToList ();
break;
case "Year":
DateGroup = data.Select (x => x.Year).Distinct ().ToList ();
break;
default:
DateGroup = data.Select (x => x.Day).Distinct ().ToList ();
break;
}
images = data.ToList ();
}
}
#region Required IKImageBrowserDataSource methods
public override nint GroupCount (IKImageBrowserView aBrowser)
{
return DateGroup.Count;
}
public override NSDictionary GetGroup (IKImageBrowserView aBrowser, nint index)
{
var dateHeader = DateGroup [(int)index];
NSRange range = GetIndexByGroup ((int)index, dateHeader);
#region Objects
var rangeValue = NSValue.FromRange (range);
var styleValue = NSNumber.FromNInt ((int)IKGroupStyle.Disclosure);
NSString titleValue = new NSString (dateHeader);
#endregion
var objs = new NSObject [] { rangeValue, titleValue, styleValue };
var keys = new string [] { GroupRangeKey, GroupTitleKey, GroupStyleKey };
return NSDictionary.FromObjectsAndKeys (objs, keys);
}
public override nint ItemCount (IKImageBrowserView aBrowser)
{
return images.Count;
}
public override IIKImageBrowserItem GetItem (IKImageBrowserView aBrowser, nint index)
{
return images [(int)index];
}
#endregion
public BrowseItem GetItemByIndex (int index)
{
return images [index];
}
NSRange GetIndexByGroup (int index, string dateHeader)
{
BrowseItem item;
var indexOfItem = 0; int count = 0;
switch (_arrangeBy) {
case "Month":
item = images.First (x => x.Month == dateHeader);
count = images.Count (x => x.Month == dateHeader);
break;
case "Year":
item = images.First (x => x.Year == dateHeader);
count = images.Count (x => x.Year == dateHeader);
break;
default:
item = images.First (x => x.Day == dateHeader);
count = images.Count (x => x.Day == dateHeader);
break;
}
indexOfItem = images.IndexOf (item);
return GetRange (indexOfItem, count);
}
NSRange GetRange (int index, int count)
{
NSRange range = new NSRange (index, count);
return range;
}
}