PerformSegueWithIdentifier выполняется более минуты или аварийно завершает работу.

В Xcode 5.0.2 я создал простое приложение для iPhone (исходный код доступен на GitHub) с контроллером навигации, который сначала отображает веб-представление с Диалоговое окно Facebook oAuth и — как только пользователь прошел аутентификацию и его данные были получены — пытается отправить DetailViewController:

скриншот раскадровки

В приведенной выше раскадровке я назвал переход segue и вставил его в ViewController.m следующим кодом:

[self performSegueWithIdentifier: @"segue" sender: self];

NSLog(@"id: %@", dict[@"id"]);
NSLog(@"first_name: %@", dict[@"first_name"]);
NSLog(@"last_name: %@", dict[@"last_name"]);
NSLog(@"gender: %@", dict[@"gender"]);
NSLog(@"city: %@", dict[@"location"][@"name"]);

Пользовательские данные Facebook извлекаются нормально и печатаются почти сразу:

id: 597287941
first_name: Alexander
last_name: Farber
gender: male
city: Bochum, Germany

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

2014-01-09 22:11:29.017 oauthFacebook[4012:1403] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<DetailViewController 0x8a89cd0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key id.'
*** First throw call stack:
(
    0   CoreFoundation                      0x0173b5e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x014be8b6 objc_exception_throw + 44
    2   CoreFoundation                      0x017cb6a1 -[NSException raise] + 17
    3   Foundation                          0x0117f9ee -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] + 282
    4   Foundation                          0x010ebcfb _NSSetUsingKeyValueSetter + 88
    5   Foundation                          0x010eb253 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 267
    6   Foundation                          0x0114d70a -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 412
    7   UIKit                               0x004cea15 -[UIRuntimeOutletConnection connect] + 106
    8   libobjc.A.dylib                     0x014d07d2 -[NSObject performSelector:] + 62
    9   CoreFoundation                      0x01736b6a -[NSArray makeObjectsPerformSelector:] + 314
    10  UIKit                               0x004cd56e -[UINib instantiateWithOwner:options:] + 1417
    11  UIKit                               0x0033f605 -[UIViewController _loadViewFromNibNamed:bundle:] + 280
    12  UIKit                               0x0033fdad -[UIViewController loadView] + 302
    13  UIKit                               0x003400ae -[UIViewController loadViewIfRequired] + 78
    14  UIKit                               0x003405b4 -[UIViewController view] + 35
    15  UIKit                               0x0035a3e2 -[UINavigationController _startCustomTransition:] + 778
    16  UIKit                               0x003670c7 -[UINavigationController _startDeferredTransitionIfNeeded:] + 688
    17  UIKit                               0x00367cb9 -[UINavigationController __viewWillLayoutSubviews] + 57
    18  UIKit                               0x004a1181 -[UILayoutContainerView layoutSubviews] + 213
    19  UIKit                               0x00297267 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
    20  libobjc.A.dylib                     0x014d081f -[NSObject performSelector:withObject:] + 70
    21  QuartzCore                          0x03b492ea -[CALayer layoutSublayers] + 148
    22  QuartzCore                          0x03b3d0d4 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    23  QuartzCore                          0x03b3cf40 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
    24  QuartzCore                          0x03aa4ae6 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
    25  QuartzCore                          0x03aa5e71 _ZN2CA11Transaction6commitEv + 393
    26  QuartzCore                          0x03aa60c2 _ZN2CA11Transaction14release_threadEPv + 226
    27  libsystem_pthread.dylib             0x01e7681c _pthread_tsd_cleanup + 93
    28  libsystem_pthread.dylib             0x01e7327e _pthread_exit + 108
    29  libsystem_pthread.dylib             0x01e73dd8 pthread_workqueue_setdispatchoffset_np + 0
    30  libsystem_pthread.dylib             0x01e77cce start_wqthread + 30
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

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

ОБНОВЛЕНИЕ:

Я почистил IBOutlets, как предложил Савана (спасибо), но приложение все равно вылетает:

2014-01-10 10:26:59.379 oauthFacebook[4342:4113] bool _WebTryThreadLock(bool), 0x8be2960: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...
1   0x51481ae WebThreadLock
2   0x452a57 -[UIWebDocumentView _responderForBecomeFirstResponder]
3   0x27da9e -[UIView setUserInteractionEnabled:]
4   0x934d72 -[_UIViewControllerTransitionContext _disableInteractionForViews:]
5   0x368573 -[UINavigationController pushViewController:transition:forceImmediate:]
6   0x3680b5 -[UINavigationController pushViewController:animated:]
7   0x770c65 -[UIStoryboardPushSegue perform]
8   0x76107e -[UIStoryboardSegueTemplate _perform:]
9   0x342280 -[UIViewController performSegueWithIdentifier:sender:]
10  0x29f0 __32-[ViewController fetchFacebook:]_block_invoke
11  0x11da695 __67+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]_block_invoke_2
12  0x113a945 -[NSBlockOperation main]
13  0x1193829 -[__NSOperationInternal _start:]
14  0x1110558 -[NSOperation start]
15  0x1195af4 __NSOQSchedule_f
16  0x1ae74b0 _dispatch_client_callout
17  0x1ad4018 _dispatch_async_redirect_invoke
18  0x1ae74b0 _dispatch_client_callout
19  0x1ad5eeb _dispatch_root_queue_drain
20  0x1ad6137 _dispatch_worker_thread2
21  0x1e73dab _pthread_wqthread
22  0x1e77cce start_wqthread
(lldb) 

А также, когда я добавляю assert([NSThread isMainThread]); перед вызовом performSegueWithIdentifier, я вижу, что это не основной поток...

Требуется ли присутствие в основном потоке для вызова performSegueWithIdentifier?


person Alexander Farber    schedule 09.01.2014    source источник
comment
Проблема в вашем DetailViewController. Это может быть несколько вещей... Но сначала я бы проверил ваши IBOutlet и IBActions в DetailViewController, чтобы убедиться, что вы не подключены к несуществующему IBOutlet или IBAction.   -  person Lyndsey Scott    schedule 10.01.2014


Ответы (2)


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

         dispatch_async(dispatch_get_main_queue(), ^(void) {
             [self performSegueWithIdentifier: @"segue" sender: self];
         });
person Alexander Farber    schedule 10.01.2014
comment
В качестве предложения никогда не делайте вызовы, связанные с пользовательским интерфейсом, в очереди, которая не является основной. - person The dude; 10.01.2014

введите описание изображения здесьЯ скачал и проверил вашу раскадровку в подробностях, просмотрите контроллер и выход из первого текстового поля в идентификатор пользователя и id, но в коде нет IBoutlet, удалите id IBOutlet в раскадровке

person savana    schedule 09.01.2014
comment
Хорошо, спасибо, но я все равно пока не пользуюсь этими выходами (просто печатаю данные с NSLog). Возможно, это проблема с потоком - так как я вызываю performSegueWithIdentifier из обратного вызова Facebook? - person Alexander Farber; 10.01.2014
comment
нет все в порядке, убери розетку и все заработает - person savana; 10.01.2014