it-roy-ru.com

"wait_fences: не удалось получить ответ: 10004003"?

Я получаю эту загадочную ошибку в первый раз (и только в первый раз) мое представление загружается из-за следующей строки кода:

- (void)viewWillAppear:(BOOL)animated
{
    [textField becomeFirstResponder];
}

Из-за этого происходит заметная (~ 3 - 4 секунды, даже на симуляторе) задержка, из-за которой мое приложение перестает отвечать на запросы. Кто-нибудь знает, как это исправить? Я не могу найти какую-либо документацию по этому вопросу на сайте Apple или какие-либо решения здесь или в Google.

Странно, что происходит противоположная ситуация, если я помещаю строку в -viewDidAppear: вместо -viewWillAppear:; то есть, вместо того, чтобы печатать ошибку только при первом показе клавиатуры и никогда больше, ошибка печатается не в первый раз, но каждый раз после. Это вызывает у меня сильную головную боль.

94
Michael

Переопределите -viewDidAppear:, а не -viewWillAppear, и обязательно вызовите [super viewDidAppear:]. Вы не должны выполнять анимацию, когда вы не на экране («появится»). И документы -viewDidAppear: объясняют, что вы должны вызывать super, потому что у них есть свои дела.

104
Rob Napier

Я получил похожую ошибку, когда быстро:

  1. Отклонение модального вида 
  2. Обновление основного вида 
  3. Представление нового модального представления

Я заметил, что получаю только в симуляторе, а не на устройстве. Кроме того, я попал в бесконечный цикл.

Мое решение состояло в том, чтобы отложить представление нового модального представления. Кажется, что быстрое обновление иерархии представлений вызвало некоторую гонку в коде Apple. 

Имея это в виду, попробуйте это:

     - (void)viewDidAppear:(BOOL)animated{

            [super viewDidAppear:animated];
            [textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
  }

У вас могут быть проблемы с представлением клавиатуры для UITextField, которого еще нет на экране. Это может вызвать проблемы, похожие на мою.

Кроме того, вы делаете паузу, давая время обновления иерархии, прежде чем представлять клавиатуру, на всякий случай. 

Надеюсь это поможет.

22
Corey Floyd

Убедитесь, что вы взаимодействуете только с пользовательским интерфейсом в основном потоке. Я получил wait_fences: failed to receive reply: 10004003, пока сидел там и ждал, пока UIAlertView покажет около 5 секунд, потому что соответствующий код был выполнен в фоновом потоке. Вы можете убедиться, поместив свой код в блок и отправив его в основной поток:

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];
    }
});
12
diachedelic

Перепробовав все, что я смог найти в Google, и ничего из этого не заработало, я решил эту проблему. Ключ в том, что я делаю это в методе делегата willDismissWithButtonIndex. Прежде чем я делал это в другом месте.

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
    [myTextField resignFirstResponder];
    [myTextField removeFromSuperview];  
    [myTextField release];  
}
9
warehouselabs

Если у вас есть следующая строка в viewDidLoad, это может вызвать это сообщение. Прокомментируйте следующую строку.

[[UIApplication sharedApplication] setStatusBarHidden:YES]; //This line should be commented

(Вместо этого вы можете отключить строку состояния в файле plist приложения).

8
rlcoder

После нескольких тестов основным правилом является: «Не выполняйте анимацию до увольнения или анимационного шоу».

Например:

  • не вызывайте -dismissModalViewControllerAnimated:YES после делегирования обратного вызова UIAlertView -alertView:willDismissWithButtonIndex: (дождитесь исчезновения из представления предупреждений, прежде чем делать это с помощью обратного вызова -alertView:didDismissWithButtonIndex:)
  • не пытайтесь показать клавиатуру (becomeFirstResponder) до того, как ваш контроллер представления появится на экране.

Могут случиться плохие вещи.

Надеюсь, это будет полезно ;-)

7
nverinaud

Это сработало для меня, чтобы заставить клавиатуру показывать себя немедленно, без анимации или задержки.

Пусть textField будет переменной экземпляра MyViewController (подкласс UIViewController).

Вызовите [textField becomeFirstResponder] в initWithNibName:bundle: (для подкласса UIViewController) или initWithStyle: (для подкласса UITableViewController), а не в viewDidLoad. Например.:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [textField becomeFirstResponder];
    }
    return self;
}

Или вызовите его сразу после инициализации, но перед нажатием UIViewController. Например.:

MyViewController *viewController = [[MyViewController alloc] init];
[viewController.textField becomeFirstResponder];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];
5
ma11hew28

Вы сделали [textfield becomeFirstResponder];

И после того, как вы получите значение из текстового поля в вашем коде, выполните [textfield resignFirstResponder];. Это поможет вам, я думаю.

5
Gani

Если вы используете текущий iPhone Simulator 4.0, это сообщение об ошибке часто появляется при повороте экрана (или при анимации после поворота экрана), сопровождающемся 1-2-секундной задержкой анимации.

Это ошибка в этой версии симулятора и должна быть исправлена ​​в ближайшее время.

4
Matt Gallagher

Смотрите здесь для получения дополнительной информации: http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/17373-wait_fences-failed-receive-reply-10004003-a.html

Ваша проблема связана.

3
Andrew Johnson

Я могу смоделировать это один на один с помощью этого кода UIAlertView.

   UIAlertView *alert = [[UIAlertView alloc]
                   initWithTitle:NSLocalizedString(@"defineTitle",@"defineTitle")
                         message:NSLocalizedString(@"defineBody", @"defineBody")
                        delegate:self
               cancelButtonTitle:NSLocalizedString(@"Ok", @"Ok")
               otherButtonTitles:nil];
   [alert show];

Когда NSLocalizedString не определены в файле Localizable.strings, поиск текстов займет много времени , так что появится предупреждение и будет показано «wait_fences: не удалось получить ответ: 10004003».

Мне нужно было только добавить тексты в файлы Localizable.strings, и мои проблемы были решены. Может быть, это касается и других случаев?

3
Vincent

переопределить viewDidappear, а не viewWillAppear:

-(void) viewDidAppear:(BOOL) animated
{
 [super viewDidAppear:animated];
 [myTextField becomeFirstResponder];
}
3
Wagh

Также с UIAlertView. То, что решило это для меня, имело отставку как ниже, как упоминалось ранее на складах.

- (void)didPresentAlertView:(UIAlertView *)alertView
{
    [txtListingPassword becomeFirstResponder];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [txtListingPassword resignFirstResponder];
}

Другие делегаты UIAlertViewDelegate не устранили проблему.

1
Marcus

Проблема в том, что в коде Apple есть условие гонки. Обычно это связано с неправильными обновлениями пользовательского интерфейса.

По моему опыту, вы либо не вызывали super в viewDidAppear, viewWillAppear и т.д. Или вы пытаетесь отобразить UIAlertView в viewDidLoad или viewWillAppear.

Когда вы добавляете UIAlertView, платформе нужна ссылка на ваше родительское представление. Но если вы находитесь в viewWillAppear или viewDidLoad, представление фактически не отображается ... Вы должны рассмотреть возможность перемещения кода в viewDidAppear, где представление готово для использования UIAlertView.

1
SmallChess

Решение здесь!

У меня была та же ошибка, теперь у меня есть решение, это может вам помочь.

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}
0
SachinVsSachin

Содержится ли текстовое поле в этом представлении или в чем-то еще? Вы можете только отправить функцию “стали для первого раза” в то, что содержится непосредственно в этом представлении. Если он хранится в каком-либо другом компоненте виджета, вы не должны устанавливать статус первого респондента в этом виджете, а скорее в виджете, который создается. Например, если вы добавляете текстовое поле в представление предупреждений, поскольку показ происходит асинхронно, он может не появиться к моменту, когда вы вызываете становление beginFirstResponder. (В идеале у вас должен быть свой собственный класс представления предупреждений, и вы определяете текстовое поле внутри него, и когда это представление получает viewDidAppear, вы должны установить текстовое поле в качестве первого респондента в этой точке.)

0
AlBlue

Я также получаю сообщение wait_fences: failed to receive reply: 10004003, и мои методы viewWill... и viewDid... ничего не делают, кроме отправки сообщений в super. В моем случае это происходит, когда в моем UIAlertView отображается GameViewController, а пользователь вместо этого нажимает на круглую кнопку устройства iPhone и затем возвращается в приложение. Это выглядит из моих рук.

0
SK9

Предупреждения или таблицы действий должны отображаться в основных потоках ... поэтому, если вы выполняете какие-либо синхронные подключения и выполняете эту операцию в другом потоке и показывает предупреждения на основе выходных данных, полученных из этой операции, вы получите это сообщение об ошибке wait_fences: не удалось получить ответ: 10004003. Вы можете сделать что-то вроде ....

[self performSelectotOnMainThread:@selector(handleOutput:) withObject:output waitUntilDone:YES/NO];

и показывать оповещения в методе handleOutput, передавая строку выходного ответа в качестве параметра.

0
Vishal Singh