gpt4 book ai didi

xamarin.ios - 单点触控 : how to optimize the performance for manual load the NIB

转载 作者:行者123 更新时间:2023-12-01 18:59:04 24 4
gpt4 key购买 nike

我使用 ScrollView 来显示多页 View ,其中有超过10页。 (scrollview.PageEnabled=true)

ScrollView 中的每个页面都有大约 6 个 subview (名为:ABCUI),每个 subview 都是从 nib 加载的:

    this.scrollview.DecelerationEnded+= scrollView_DecelerationEnded(...);

public void LoadSubView(int nPageNo)
{
if (this.PageLoaded(nPageNo))
return;

for (int i=0;i<6;i++)
{
ABCViewController abcUI=MonoTouch.Foundation.NSBundle.MainBundle.LoadNib ("ABCUI", this, null); //XIB file size: 20K

abcui.SetTitle(...);
abcui.SetXXXX(...);
abcui.frame = .. pageFrame.X += this.ScrollView.Frame.Width+nPage*...;

this.scrollview.addsubview(abcUI.view,...);
}
}


public void scrollView_DecelerationEnded (object sender, EventArgs e)
{
int nPageNo=(int)Math.Ceiling((this.ScrollView.ContentOffset.X+1)/this.ScrollView.Frame.Width);

this.LoadSubView(nPageNo +1);
this.LoadSubView(nPageNo - 1);
}

public void Button1Clicked(object sender, EventArgs e)
{
this.ClearViewsInScrollView();
this.LoadSubView(1);
}

当用户触发button1点击时,它会将第一页加载到scrollview中(一次只有1页,但1页有6个 subview ),当用户滚动scrollview时,它将加载下一页。

但是在scrollview中加载第一页或者切换页面会花费很长时间,所以用户必须等待:

  1. ipad1:约1000ms
  2. iPad2:约600毫秒
  3. 在模拟器中:100ms;

如何优化性能(降低到300ms/ipad1以下)?

最佳答案

非常好的问题和绝佳的时机,因为过去几天我一直在研究类似的事情。

现在,我不确定这个解决方案是否能让您加载 < 300 毫秒,但理论上它更快。

(您会看到“XIB”和“NIB”术语。我指的是同一件事。毕竟,NIB 是“编译的”XIB。)

整个事情的关键是防止多次加载每个 XIB 文件。没有理由这样做,因为您(我们)基本上需要的是 XIB 中对象的实例,而不是占用内存的 XIB 本身。

幸运的是,iOS SDK提供了UINib类,它可以做我们想要的事情。通过这个类,我们可以创建 XIB 内容的多个实例,而不必每次都加载 XIB 本身,只需在“开始”加载一次即可。

具体操作方法如下:

首先,为您想要的每个 XIB 文件创建一个 UINib 对象。

// Loads a NIB file without instantiating its contents.
// Simplified here, but to have access to a NIB for the whole lifecycle of the app,
// create a singleton somewhere.
static UINib abcuiNib = UINib.FromName("ABCUI", NSBundle.MainBundle);

其次,将 NIB 加载到内存后,您现在可以从中获取对象。

abcuiNib.InstantiateWithOwneroptions(this, new NSDictionary());

注意“this”参数。由于它是您要加载的 View Controller ,因此上面的行应该位于对象生命周期早期的某个位置,例如在构造函数中:

public partial class ABCViewController : UIViewController
{

public ABCViewController()
{

// The first parameter is needed to set an owner (File's Owner) for the objects
// that will be instantiated.
// The second parameter is for various options. It does not accept null in MonoTouch,
// but you can just pass an empty NSDictionary.
// If you have all your outlets correctly set up, the following line is all
// that is needed.
abcuiNib.InstantiateWithOwneroptions(this, new NSDictionary());

}

// We don't need the following, as it will load the XIB every time
//public ABCViewController() : base("ABCUI", null) {}

// view controller implementation

}

请注意,我尚未测试上述内容,因为到目前为止我已经使用 XIB 中的各种单个对象对其进行了测试。如果(以及何时)我将它与 XIB 中的 UIViewController 一起使用,这就是我将前进的方向。我还将在适当的时候准备一篇包含更深入的发现和信息的文章。

另请注意,适用相同的“规则”,例如。您仍然需要在 ViewDidUnload 覆盖中释放所有 socket 。

如果在此之后,您没有发现性能有任何改进,我认为您将需要重新设计您的 XIB。 Apple 建议最好拥有多个 XIB,每个 XIB 中只包含少量对象,而不是少数 XIB 中装有对象。

有用的阅读:Apple docs on NIB management

关于xamarin.ios - 单点触控 : how to optimize the performance for manual load the NIB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9670564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com