gpt4 book ai didi

xamarin.ios - 为什么 UIView.StringSize 需要在 UI 线程上运行?

转载 作者:行者123 更新时间:2023-12-02 03:50:48 24 4
gpt4 key购买 nike

如果我从一些异步代码(如 Task.ContinueWith)中运行 UIView.StringSize,它将因 UIKitThreadAccessException 而爆炸,因为方法以调用 UIApplication.EnsureUIThread(MonoDevelop 中的“Go to declaration”;我不确定许可证是否允许我在此处发布)开始。

Task.Factory.StartNew(() => {
// Blows up discretely...nothing written to application output.
// Also blows up for UIViews that exist only in code (not rendered).
SizeF textSize = someView.StringSize(someString, someFont, new SizeF(someView.Bounds.Width, float.MaxValue), UILineBreakMode.WordWrap);
Console.WriteLine(textSize);
});

如果我将这个简化版本包装在 InvokeOnMainThread 中,一切都很好,但有时我想在没有调用的情况下测量一些文本。同样,我完全理解 exception's purpose之前在异步代码中调用某些东西时,它为我省去了很多麻烦,但在这种情况下,在这里使用 EnsureUIThread 似乎是不必要的。如果我简单地将该调用重述为对 NSString 类的点击,它将愉快地在 UI 线程之外运行。

Task.Factory.StartNew(() => {
// Outputs expected size data: "{Width=##, Height=##}".
using (NSString nssSomeString = new NSString(someString)) {
SizeF textSize = nssSomeString.StringSize(someFont, new SizeF(someView.Bounds.Width, float.MaxValue), UILineBreakMode.WordWrap);
Console.WriteLine(textSize);
}
});

UIView.StringSize 的代码似乎做了大致相同的 NSString 工作,并且似乎没有任何明显的面向 UI 线程的内容。是否缺少需要从 UI 线程调用此版本方法的内容?

编辑(2013-01-17):

filed a bug with Xamarin只是为了看看他们的 react 。听起来他们正在研究将此方法标记为 ThreadSafe

最佳答案

这是因为您的 UIView 正在从一个不是创建它的线程访问。由于您是在后台线程中创建 NSString,因此您的第二个示例可以正常工作并被推荐。 (尽管我认为您也不应该尝试从后台线程访问 someView.Bounds)

我怀疑这也行:

var bounds = someView.Bounds; //UI thread
Task.Factory.StartNew(() => {
// Outputs expected size data: "{Width=##, Height=##}".
using (UIView view = new UIView()) {
SizeF textSize = view.StringSize(someString, someFont, new SizeF(bounds.Width, float.MaxValue), UILineBreakMode.WordWrap);
Console.WriteLine(textSize);
}
});

但我会坚持使用 NSString:

var bounds = someView.Bounds; //UI thread
Task.Factory.StartNew(() => {
// Outputs expected size data: "{Width=##, Height=##}".
using (NSString nssSomeString = new NSString(someString)) {
SizeF textSize = nssSomeString.StringSize(someFont, new SizeF(bounds.Width, float.MaxValue), UILineBreakMode.WordWrap);
Console.WriteLine(textSize);
}
});

关于xamarin.ios - 为什么 UIView.StringSize 需要在 UI 线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14385826/

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