Reputation: 660
I'm having an issue where my app is crashing on sleep, and sometimes on home. I'm getting a BAD_ACCESS
error in a thread called gpus_ReturnNotPermittedKillClient
, which tells me that my app is making UI changes in the background, which to my understanding is a no-go. Therefore, I'm stepping through my code to see what happens on home / sleep, and I find that my breakpoint in my VC's -viewWillLayoutSubviews
method is getting hit AFTER the breakpoints in the -applicationWillResignActive
and -appplicationDidEnterBackground
notifications (in which I'm attempting to stop all updates from an asynchronous callback function).
That doesn't seem to make any sense. From the application's perspective, if it's not cool to do UI updates in the background, why call viewWillLayoutSubviews
after you're in the background?
EDIT: It appears to do this even when my app doesn't crash. Could it just be lldb getting things out of order?
Upvotes: 3
Views: 2093
Reputation: 29886
I think you simply need to be tolerant of this. Per this tech note, you can't do any GLES rendering in the background. My recommendation would be for your app to set a flag when applicationWillResignActive
is called, and then before doing any rendering work you check that flag and don't do the work (and perhaps just call -setNeedsDisplay
on the view so that if your app becomes active again it will know to draw that view). You seem troubled by the fact that viewWillLayoutSubviews
is getting called "late", but I don't see how that really matters. (i.e. layout != rendering) I would be surprised if your view's -drawRect:
method were getting called after applicationDidEnterBackground
but I would still say that it would be your responsibility to check a flag and not render if your app is in the background.
Upvotes: 1