unable to update UI on main thread in 10.13
unable to update UI on main thread in 10.13
- Subject: unable to update UI on main thread in 10.13
- From: sqwarqDev <email@hidden>
- Date: Fri, 27 Oct 2017 21:03:49 +0700
I have a subclass of NSTextView which I'm trying to update in my UI. When the
user clicks a button in the main UI, I run a bunch of processes in the
background, save their output to an attributed string, then update the
textview's textstorage on the main thread using performSelector(onMainThread:).
@IBAction func profileAction(_ sender: Any)
{
<background stuff that appends text to a string, then wait till
it's all done with repeat timer >...
this_timer = Timer.scheduledTimer(timeInterval: 1.0, target:
self, selector: #selector(self.myRepeatFunc),userInfo: nil, repeats: true)
this_timer.fire()
}
@objc func myRepeatFunc()
{
if stuffIsDone == true
{
this_timer.invalidate()
self.scanBtn.isEnabled = true
self.profileBtn.isEnabled = true
self.historyBtn.isEnabled = true
performSelector(onMainThread: #selector(updateUI), with: nil,
waitUntilDone: false)
}
}
@objc func updateUI()
{
let zeroAttributesString = NSMutableAttributedString(string: "")
self.profilerTextView.textStorage?.setAttributedString(zeroAttributesString)
self.profilerTextView.textStorage?.setAttributedString(self.superAttributedString)
}
This works absolutely fine in both 10.11 and 10.12; however, on 10.13 I get the
dreaded "This application is modifying the autolayout engine from a background
thread after the engine was accessed from the main thread. This can lead to
engine corruption and weird crashes." message.
I've tried swapping out performSelector(onMainThread:) for
DispatchQueue.main.async to no avail. I still get the same error. I've tried
using Xcode 9's 'Main Thread Checker' diagnostic tool, but even though I have
'Pause on issues' selected, it never pauses and just lets my code run. I've
also tried symbolic breakpoints on [NSView setFrame] and
_AssertAutolayoutOnAllowedThreadsOnly from the stack trace. Neither stop my
code.
I'm out of ideas, and the rubber duck has come up short. Any advice much
appreciated (stack trace follows):
This application is modifying the autolayout engine from a background thread
after the engine was accessed from the main thread. This can lead to engine
corruption and weird crashes.
Stack:(
0 Foundation 0x00007fff51ccc87a
_AssertAutolayoutOnAllowedThreadsOnly + 201
1 Foundation 0x00007fff51cccf0d -[NSISEngine
_optimizeIfNotDisabled] + 25
2 Foundation 0x00007fff51a526f4 -[NSISEngine
constraintDidChangeSuchThatMarker:shouldBeReplacedByMarkerPlusDelta:] + 173
3 Foundation 0x00007fff51a52572 -[NSISEngine
tryToChangeConstraintSuchThatMarker:isReplacedByMarkerPlusDelta:undoHandler:] +
312
4 Foundation 0x00007fff51a46320
-[NSLayoutConstraint _tryToChangeContainerGeometryWithUndoHandler:] + 484
5 Foundation 0x00007fff51a42eaa
-[NSLayoutConstraint _setSymbolicConstant:constant:] + 311
6 Foundation 0x00007fff51a42d45
-[NSLayoutConstraint setConstant:] + 68
7 AppKit 0x00007fff4da9e7a0
-[NSView(NSConstraintBasedLayout)
_updateSimpleAutoresizingConstraintsInPlace:forAutoresizingMask:] + 1501
8 AppKit 0x00007fff4da9ea35
NSViewUpdateConstraintsForFrameChange + 441
9 AppKit 0x00007fff4cfa4599 -[NSView
setFrameSize:] + 1515
10 AppKit 0x00007fff4cfbaa52 -[NSView
setFrame:] + 371
11 AppKit 0x00007fff4cf70e33 -[NSClipView
_updateOverhangSubviewsIfNeeded] + 839
12 AppKit 0x00007fff4d04050d -[NSClipView
_reflectDocumentViewFrameChange] + 692
13 AppKit 0x00007fff4cfaa1b0 -[NSView
_postFrameChangeNotification] + 83
14 AppKit 0x00007fff4cfa47bb -[NSView
setFrameSize:] + 2061
15 AppKit 0x00007fff4d03a23b
-[NSTextView(NSPrivate) _setFrameSize:forceScroll:] + 1081
16 AppKit 0x00007fff4d039d3a -[NSTextView
setFrameSize:] + 143
17 AppKit 0x00007fff4d0392ac -[NSTextView
setConstrainedFrameSize:] + 635
18 UIFoundation 0x00007fff72e25084
-[NSLayoutManager(NSPrivate) _resizeTextViewForTextContainer:] + 938
19 UIFoundation 0x00007fff72f392d6
_resizeTextViewsIfNeeded + 285
20 UIFoundation 0x00007fff72e29ea2
_NSFastFillAllLayoutHolesForGlyphRange + 1851
21 UIFoundation 0x00007fff72e6890b
-[NSLayoutManager lineFragmentRectForGlyphAtIndex:effectiveRange:] + 39
22 AppKit 0x00007fff4d1071de -[NSTextView
_extendedGlyphRangeForRange:maxGlyphIndex:drawingToScreen:] + 509
23 AppKit 0x00007fff4d0d69fc -[NSTextView
drawRect:] + 1807
24 AppKit 0x00007fff4d82ee3d
_NSViewDrawRect + 83
25 AppKit 0x00007fff4d83c0d4
-[NSView(NSInternal)
_recursive:displayRectIgnoringOpacity:inGraphicsContext:shouldChangeFontReferenceColor:]
+ 1578
26 AppKit 0x00007fff4d83baa4
-[NSView(NSInternal)
_recursive:displayRectIgnoringOpacity:inContext:shouldChangeFontReferenceColor:]
+ 56
27 AppKit 0x00007fff4d0ce374
__46-[NSView(NSLayerKitGlue) drawLayer:inContext:]_block_invoke + 289
28 AppKit 0x00007fff4d0cdf08
-[NSView(NSLayerKitGlue) _drawViewBackingLayer:inContext:drawingHandler:] + 1577
29 AppKit 0x00007fff4d0cd8d9
-[NSView(NSLayerKitGlue) drawLayer:inContext:] + 77
30 AppKit 0x00007fff4d272cbc -[NSTextView
drawLayer:inContext:] + 114
31 AppKit 0x00007fff4d1ef863
-[_NSBackingLayerContents drawLayer:inContext:] + 165
32 QuartzCore 0x00007fff5aa50b76 -[CALayer
drawInContext:] + 281
33 AppKit 0x00007fff4d1ef44d
-[_NSTiledLayer drawTile:inContext:] + 634
34 AppKit 0x00007fff4d1ef179
-[_NSTiledLayerContents drawLayer:inContext:] + 181
35 QuartzCore 0x00007fff5aa50b76 -[CALayer
drawInContext:] + 281
36 AppKit 0x00007fff4d1ef0b9
-[NSTileLayer drawInContext:] + 166
TIA
Best
Phil
@sqwarq
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden