【问题标题】:Can NSLayoutManager be safely used on background thread?NSLayoutManager 可以在后台线程上安全使用吗?
【发布时间】:2014-05-01 02:50:10
【问题描述】:

即使 iOS 文档说:

可以访问NLayoutManager、NSTextStorage和NSTextContainer 只要应用程序保证从单个子线程访问 线程。

我偶尔会遇到这个异常:

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'只在主服务器上运行 线程!'

这是回溯:

Exception Type:  SIGABRT
Exception Codes: #0 at 0x197bca58c
Crashed Thread:  7

Application Specific Information:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Only run on the main thread!'

Last Exception Backtrace:
0   CoreFoundation                       0x000000018afd2f50 __exceptionPreprocess + 132
1   libobjc.A.dylib                      0x00000001974dc1fc objc_exception_throw + 56
2   CoreFoundation                       0x000000018afd2e10 +[NSException raise:format:arguments:] + 112
3   Foundation                           0x000000018bb0ae20 -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 84
4   UIFoundation                         0x00000001940f0654 -[NSLayoutManager(NSPrivate) _resizeTextViewForTextContainer:] + 412
5   UIFoundation                         0x00000001940f0318 -[NSLayoutManager(NSPrivate) _recalculateUsageForTextContainerAtIndex:] + 1748
6   UIFoundation                         0x000000019411ec2c _enableTextViewResizing + 236
7   UIFoundation                         0x0000000194123e18 -[NSLayoutManager textContainerForGlyphAtIndex:effectiveRange:] + 484
8   UIFoundation                         0x0000000194125c60 -[NSLayoutManager glyphRangeForTextContainer:] + 352

需要注意的一点是我的NLayoutManager 附加到UITextView。您可以将其视为普通的UITextView,用于在后台线程中进行文本布局。

那么这是否意味着与文档所说的相矛盾,如果NLayoutManager 附加到UITextView,则它不能安全地用于单个后台线程?

【问题讨论】:

  • 您找到解决方案了吗?我现在遇到了同样的问题。我想在后台使用一个单元格来重新计算大小。

标签: ios textkit nslayoutmanager


【解决方案1】:

在我看来,文档中的注释实际上解释了问题。由于您使用的是附加到 UITextView 的布局管理器,因此您不能保证它是从单个线程访问的。最好假设文本视图可以随时访问布局管理器,尤其是当视图在屏幕上时。您无法确切知道它是如何使用布局管理器的,但可以肯定的是它发生在主线程上。

您可以让后台线程创建单独的NSLayoutManagerNSTextStorageNSTextContainer,进行所有布局计算,然后在主线程上应用这些计算。

【讨论】:

  • UITextView 也被创建并且只能在同一个后台线程中访问。
  • @an0 一般情况下,UIKit 类是不允许在非主线程中使用的,除非有一些特殊情况。所以,我认为你不能在后台线程中安全地创建 UITextView 实例。
猜你喜欢
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多