Pergunta

No Xcode 5.0.2 eu criei um aplicativo simples para iPhone (o código fonte está disponível no GitHub) com controlador de navegação, que primeiro exibe uma visualização da web com Diálogo oAuth do Facebook e - uma vez que o usuário tenha se autenticado e seus detalhes tenham sido obtidos - tenta enviar o DetailViewController:

storyboard screenshot

No storyboard acima eu chamei o segue segue e empurre-o para dentro ViewController.m pelo seguinte código:

[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"]);

Os dados do usuário do Facebook são obtidos corretamente e impressos quase imediatamente:

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

mas cerca de um minuto se passa antes que a transição ocorra ou às vezes o aplicativo até trava com:

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) 

Qual poderia ser o motivo desse comportamento, por favor?

ATUALIZAR:

Limpei os IBOutlets conforme sugerido por Savana (obrigado), mas o aplicativo ainda trava:

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) 

E também quando adiciono um assert([NSThread isMainThread]); antes de o performSegueWithIdentifier ligue, posso ver que este não é o tópico principal ...

Estar no thread principal é um requisito para chamar performSegueWithIdentifier?

Foi útil?

Solução

Consegui resolver meu problema (o controlador de visualização de detalhes sendo exibido após um atraso ou o aplicativo até travando) com este código:

         dispatch_async(dispatch_get_main_queue(), ^(void) {
             [self performSegueWithIdentifier: @"segue" sender: self];
         });

Outras dicas

enter image description hereEu baixei e verifiquei seu storyboard em detalhes, visualize o controlador, há uma saída do primeiro campo de texto para o ID do usuário e o id, mas não há IBoutlet no código, exclua o id IBOutlet no storyboard

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top