2012-01-24 4 views
2

Еще один крик о помощи в этом предупреждении.wait_fences: не удалось получить ответ: 10004003 (снова)

Прежде всего, я рассмотрел все вопросы здесь, в другом месте, и ни один из них не соответствует моей ситуации. Он не имеет ничего общего с боксами Alert и уходит в отставку в качестве первого ответчика и не выполняет никакой анимации до того, как будут отображаться представления. Моя проблема возникает при создании пользовательской клавиатуры на основе UIView.

Во-вторых, я считаю, что я могу заставить предупреждение появиться/исчезнуть по желанию. Я просто очень смущен, почему, поэтому я ищу больше объяснений, чем решение.

Существует слишком много кода, чтобы разместить здесь, так что я просто дать описание того, что происходит:

ViewController «Calc» конкретизирует пользовательские UIView на основе «DataView» в loadView в ВК , а затем добавляет его в качестве дополнительного представления VC.

«DataView» конкретизирует пользовательский UITextField на основе «TextFieldKPD» в методе инициализации в DataView в

«TextField» инстанцируют пользовательские UIView на основе «KeyPad» в методе инициализации текстовой поля, и присваивает KeyPad к TextField-х inputView.

«KeyPad» создает 13 UIButtons типа UIButtonTypeCustom, считывает и присваивает «нажатые» и «не нажатые» изображения для каждой кнопки, а также устанавливает действия для кнопок. Затем он добавляет каждую кнопку в качестве подзадачи самого себя. (Контролируя, когда в UIView жизненного цикла KeyPad, что эта конструкция имеет место, то, как я могу повлиять на предупреждение wait_fences: см. Ниже)

В «Calc» ViewController является тот, который изначально представлен пользователю , Я отслеживал предупреждение wait_fences как возникшее после конца метода viewDidLayoutSubViews Calc и до вызова метода viewDidAppear. Обратите внимание, что KeyPad не отображается, когда отображается Calc.

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

  • Если UIButtons инстанцируется и добавляет в качестве подвидов в методе инициализации кнопочной панели, то Я получу предупреждение один раз и один раз.

  • Если вместо этого кнопки создаются и добавляются в методе layoutSubViews KeyPad, предупреждение не появляется. (Но KeyPad не эффективно получить построены, пока не нажмете на TextField - до сих пор, не wait_fences не предупредив, то либо)

Там нет анимации или что-нибудь в loadView Calc в. Он создает экземпляр и присваивает весь путь вниз.

Итак, любые комментарии к этой версии wait_fences?

EDIT 1, Jan 30th - теперь с еще большим путаницей!

Мне было скучно сегодня утром, поэтому я решил сыграть с моим кодом, чтобы узнать, могу ли я лучше изолировать генерацию предупреждения.Я сузил его к следующему, совершенно бесполезному коду, с помощью которого я могу теперь вызвать предупреждение:

-(void)loadImages 
{ 
    UIImage* image; 

    for(int i=0; i<16; i++) { 
     image = [UIImage imageNamed:@"StupidFileNameThatDoesNotExist"]; 
    } 
} 

Если я выполняю [self loadImages] в методе инициализации из KeyPad затем появляется предупреждение. Но этот код ничего не делает, поскольку файл не существует. Я считаю, что если счетчик циклов достаточно мал, чтобы предупреждение уходило, но я не определил нижний предел.

Если я заменить фактическую загрузку изображения с

[UIImage imageWithContentsOfFile:@"StupidFileNameThatDoesNotExist"]

и до сих пор называют метод во время KeyPad инициализации, то я, кажется, не получить предупреждение. Одно очевидное различие между этими двумя способами загрузки изображения заключается в том, что imageNamed кэширует изображение внутри.

Таким образом, я склоняюсь к ответу Джорджа, что это внутренний винт Apple.

Edit 2, февраль 1 - Его предупреждение Джим, но не как мы знаем, что

Так что я убедил себя, что это кэширование в классе UIImage, что, очевидно, вызывает вопрос. Что с этим делать? Ну, конечно, напишите мой собственный кеш изображения!

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

И угадайте, что - я снова получаю глупое предупреждение. Для того, чтобы вообще не делать никакой реальной работы.

Я могу только сделать вывод, что есть какое-то внутреннее состояние гонки iOS, которое я запускаю, когда я перебираю дополнительный код в метод init из KeyPad. И я ничего не могу сделать, чтобы смягчить это. Все, что я могу сделать, это надеяться, что это предупреждение будет доброкачественным.

Редактировать 3, Акт Hamlet 1 Сцена 4: Что-то прогнило в Датском королевстве

Сохраняя тот же код, как и в Edit 2, я закомментирована заявление NSLog. И предупреждение ушло. Я вернул его, и появляется предупреждение.

Поэтому код у меня есть:

-(void)loadImages 
{ 
    // Iterate over button definitions and cache the required images 
    for(int i=0; i<numKeys; i++) { 

     if (![imageCache imageExistsForTag:keyTags[i]]) { 
      [imageCache addImageFile:[NSString stringWithFormat:@"%s_NP.png",keyNames[i]] forTag:keyTags[i]]; 
     } 

     if (![imageCache imageExistsForTag:keyTags[i]+pressedOffset]) { 
      [imageCache addImageFile:[NSString stringWithFormat:@"%s_P.png",keyNames[i]] forTag:keyTags[i]+pressedOffset]; 
     } 

    } 

} 

И:

-(void)addImageFile:(NSString*)imageFile forTag:(int)tag 
{ 
    NSLog(@"Adding tag:%d for file %@", tag, imageFile); 
} 

С этой NSLog заявлением контролирующего появлением предупреждения.

Edit 4, февраль 2 - Добро пожаловать в Храм Судьбы

Принимая комментарии Аллена к сердцу я перестроил свою клавиатуру как XIB и загружен, что вместо того, чтобы вручную пытаться создать представление. Конечно, ничего не исправить. Я надеялся, что загрузка Ниба произойдет за пределами того, что когда-либо это вызывает проблему.

Чувство моего чувства заключается в том, что я боюсь против состояния гонки в loadView of Calc и некоторых внутренних операций iOS. Если я сделаю слишком много работы внутри loadView, то перейду строку и откройте предупреждение wait_fences. И что клавиатура является симптомом, а не основной причиной. IE это могла быть любая деятельность, просто работа клавиатуры была последней вещью, которую я сделал до появления предупреждения. Я просто хочу, чтобы я действительно знал, каковы ограничения, что я на самом деле пересекаюсь и не спотыкаюсь в темноте.

+0

Peter, Насколько велики ваши изображения с 26 кнопками? кажется, что загрузка этих изображений превышает лимит 10, поскольку это требует яблоко, вы даже считаете, что поместили весь пользовательский интерфейс в наконечник? – Allen

+0

@Allen .. на данный момент я даже не загружаю изображения. Все, что я делаю, это создание имен изображений и отправка этой информации в NSLog. И я только что проверил тест. С того момента, как я нажал кнопку «Запустить» в XCode, пока не появится предупреждение, это 5 секунд. При запуске с моего 4-го поколения iPod touch приложение запускается менее чем за 2 секунды. –

+0

время вашего времени загрузки с этими изображениями и пересмотреть все эти фиксированные интерфейсы в наконечник. – Allen

ответ

2

У меня возникли проблемы несколько раз и пытались найти решение. Самое близкое, что я получил, было то, что, по словам инженера-яблока, это проблема, вызванная внутренне, и сторонние разработчики не должны беспокоиться об этом. Насколько мне известно, это не должно приводить к сбою вашего приложения или возникновению каких-либо проблем, кроме действительно раздражающей ошибки в отладчике, которая, кажется, сводит всех разработчиков с ума!

Извините, что я не мог больше помочь.

+0

Я собираюсь с этим ответом, исходя из моей полной неспособности рационально охарактеризовать проблему. хотя технически это не ответ, мой опыт показывает, что на этот вопрос не могут ответить простые смертные. Теперь кто такой Джон Скит из iOS? –

2

Насколько я могу рассказать о вашем описании кода, проблема возникает, когда подзаголовок (например, UIAlertView) создается до его родительского/супер-представления. Что-то связанное с цепочкой ответчиков.

Попробуйте переместить коды обзора, чтобы устранить проблему или вставить соответствующие детали.

+0

Я перемещал вещи повсюду, чтобы обеспечить, чтобы детские взгляды были созданы после их родителей и все еще имели ту же проблему. Я думаю, что многие из этих проблем основаны на суевериях людей о том, какие исправления заставляли его исчезать для их случая, но фактически не решали основную проблему. –

0

Я столкнулся с ошибкой wait_fences при ошибочном запуске кода UIKit из фонового потока. Это не похоже на то, что это ваша проблема, но если у вас еще нет этого, нужно еще кое-что изучить.

+0

У меня только один явный поток, который я использую. Не знаю, что делает iOS в фоновом режиме. –

0

По моим сведениям. Это предупреждение появляется, когда мы вызываем UIAlertView, и в то же время мы выполняем некоторую операцию над UIView. Чтобы решить эту проблему, нам не нужно выполнять операцию на UIView в это время. Для этого мы можем сделать одну из двух вещей: 1. Мы можем вызвать UIAlertView с некоторой задержкой, чтобы завершить работу над UIView. 2. Или мы можем выполнять операции над UIView в методе - (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex; Чтобы UIAlertView не был на нашем UIView в то время, когда некоторые операции выполняются на UIVIew.

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

+0

По моему вопросу я не использую оповещение или не выполняю анимацию. Это связано только с сборкой фиксированной иерархии представлений перед отображением. –

0

? Я немного не понимаю вашу иерархию view/viewcontroller ...

У вас есть ViewController «Calc», который создает «DataView» для своего «главного» представления. «DataView» создает textField «TextFieldKPD» как подвид самого себя. Затем «TextFieldKPD» создает подчиненный UIView «KeyPad», который сам создает 13 подпрограмм UIButton для себя.

Значит, ваши взгляды находятся на 4 уровнях?

Apple заявляет, что ViewController должен обрабатывать весь экран просмотра (я думаю, это немного изменилось, теперь мы можем создавать контейнеры, но намерение их утверждения остается). Убедитесь, что ваши события кнопок клавиатуры и события текстового поля обрабатываются вашим контроллером viewController.

Возможно, вам лучше создать все эти виды в viewController или в представлении мастера, чтобы ваша иерархия стала более плоской?

Извините, если я неправильно понял вашу иерархию.

Btw, попробуйте удалить текстовое поле целиком и посмотреть, можете ли вы все еще получить ошибку.

+0

Calc имеет один вид, а DataView - под-просмотр в Calc. Остальная иерархия правильная. Причина, по которой у меня есть глубокая иерархия, заключается в том, что DataView (и все в нем - это не только только текстовое поле) создается несколько раз. В некотором роде он аналогичен пользовательской ячейке в представлении таблицы (но нет представления таблицы здесь не подходит) –

+0

Это звучит как проблема синхронизации. Попробуйте использовать NSTimer для планирования создания кнопок через полсекунды позже. – ader

+0

Я уже довольно уверен, что это вопрос времени. Я хочу знать, почему это вопрос времени. –

Смежные вопросы