What needs to be executed on the main thread

0

I've got a crash like the following:

Date/Time:           2015-11-23 19:40:34.34 -0600
Launch Time:         2015-11-23 18:49:43.43 -0600
OS Version:          iOS 9.1 (13B143)
Report Version:      104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000c
Triggered by Thread:  7 

Thread 7 Crashed:
    0   libobjc.A.dylib                 0x34fcbac6 objc_msgSend + 6
    1   UIFoundation                    0x31e7242e +[NSStringDrawingTextStorageSettings threadSpecificStringDrawingTextStorageSettings:] + 62
    2   UIFoundation                    0x31e675de +[NSString(NSStringDrawing) typesetterBehavior] + 34
    3   UIFoundation                    0x31e68ae2 __NSStringDrawingEngine + 298
    4   UIFoundation                    0x31e68908 -[NSString(NSExtendedStringDrawing) drawWithRect:options:attributes:context:] + 144
    5   UIKit                           0x276aa488 -[UILabel _drawTextInRect:baselineCalculationOnly:] + 4864
    6   UIKit                           0x2771b40c -[UILabel drawTextInRect:] + 540
    7   UIKit                           0x2771b1e4 -[UILabel drawRect:] + 88
    8   UIKit                           0x2771b15e -[UIView(CALayerDelegate) drawLayer:inContext:] + 386
    9   QuartzCore                      0x26f8b6fc -[CALayer drawInContext:] + 228
    10  QuartzCore                      0x26f75088 CABackingStoreUpdate_ + 1852
    11  QuartzCore                      0x270619d0 ___ZN2CA5Layer8display_Ev_block_invoke + 52
    12  QuartzCore                      0x26f745c8 CA::Layer::display_() + 1168
    13  QuartzCore                      0x26f588a0 CA::Layer::display_if_needed(CA::Transaction*) + 204
    14  QuartzCore                      0x26f58560 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24
    15  QuartzCore                      0x26f57a78 CA::Context::commit_transaction(CA::Transaction*) + 368
    16  QuartzCore                      0x26f5772a CA::Transaction::commit() + 614
    17  QuartzCore                      0x26f84ed2 CA::Transaction::release_thread(void*) + 310
    18  libsystem_pthread.dylib         0x3589e54c _pthread_tsd_cleanup + 508
    19  libsystem_pthread.dylib         0x3589e14e _pthread_exit + 86
    20  libsystem_pthread.dylib         0x3589db3c _pthread_wqthread + 1044
    21  libsystem_pthread.dylib         0x3589d718 start_wqthread + 8

I understand I need to execute the UIKit code on the main thread. However, I'm struggling with what exactly needs to be on the main thread. Do I need to make sure a declaration like the following is done on the main thread:

UIView *lineView;

or only the modifications like the following:

lineView = [[UIView alloc] initWithFrame:CGRectMake(15, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width, 1)];

I've been wrapping things in dispatch code and I'm still getting the same crash.

Thanks.

ios
multithreading
asked on Stack Overflow Nov 28, 2015 by SteveSTL • edited Nov 28, 2015 by rmaddy

1 Answer

1

You should run on UI thread only code that shows something to user.

lineView = [[UIView alloc] initWithFrame:CGRectMake(15, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width, 1)];

this code you can run on background thread, but

[superview addSubview: lineView];

Should be executed on main thread.

answered on Stack Overflow Nov 28, 2015 by Sviatoslav Yakymiv

User contributions licensed under CC BY-SA 3.0