"wait_fences: failed to receive reply: 10004003"?
I get this cryptic error the first time (and only the first time) my view is loaded due to the following line of code:
- (void)viewWillAppear:(BOOL)animated
{
[textField becomeFirstResponder];
}
There is a noticeable (~3 – 4 second, even on the simulator) delay due to this that makes my app feel unresponsive. Does anyone know how to fix this? I can't find any documentation on it on Apple's site, or any solutions here or on Google.
Strangely, the opposite situation happens if I put the line in -viewDidAppear:
instead of -viewWillAppear:
; that is, instead of printing the error only the first time the keyboard is shown and never again, the error is not printed the first time but every time after. This is causing a major headache for me.
Override -viewDidAppear:
, not -viewWillAppear
, and make sure to call [super viewDidAppear:]
. You should not perform animations when you are not on screen ("will appear"). And the -viewDidAppear:
docs explain that you must call super
because they have their own things to do.
I was getting a similar error when quickly:
- Dismissing a modal view
- Updating the main view
- Presenting a new modal view
I noticed I was only getting it in the simulator and not on the device. Additionally, I was getting caught in an infinite loop.
My solution was to delay the presenting of the new modal view. It seems that quickly updating the view hierarchy caused some sot of race condition in Apple's code.
With that in mind, try this:
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
}
You may be having issues presenting the keyboard for a UITextField that ins't yet on screen. This may be causing problems similar to mine.
Also, you pause giving the hierarchy time to update before presenting the keyboard, just in case.
Hope this helps.
Check you are only interacting with the UI on the main thread. I got wait_fences: failed to receive reply: 10004003
while I was sitting there waiting for a UIAlertView to show for about 5 seconds because the relevant code was executed on a background thread. You can make sure by putting your code in block and sending it to the main thread:
dispatch_async(dispatch_get_main_queue(), ^{
if (!success) {
// Inform user that import failed
UIAlertView * importFailedAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ErrorTitle5", @"Import failed")
message:NSLocalizedString(@"Error5", @"Something went wrong")
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil];
[importFailedAlert show];
}
});
After trying everything I could find on Google and none of it working, this is what solved the problem for me. The key is that I'm doing this stuff in the willDismissWithButtonIndex delegate method. Before I was doing it elsewhere.
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
[myTextField resignFirstResponder];
[myTextField removeFromSuperview];
[myTextField release];
}
If you have the following line in viewDidLoad, it can cause this message. Comment the following line.
[[UIApplication sharedApplication] setStatusBarHidden:YES]; //This line should be commented
(You can disable the status bar from the application plist file instead).