performSegueWithIdentifier takes over a minute to execute or crashes

facebook-oauth, ios, iphone, segue, uistoryboardsegue

Solution

I have been able to solve my problem (the detail view controller being displayed after a delay or the app even crashing) with this code:

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

Problem

In Xcode 5.0.2 I have created a simple iPhone app (the source code is available at GitHub) with navigation controller, which first displays a web view with Facebook oAuth dialog and - once the user has authenticated and her details have been fetched - tries to push the DetailViewController: In the above storyboard I have called the segue `segue` and push it in the ViewController.m by the following code: ``` [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"]); ``` The Facebook user data is fetched fine and printed almost immediately: ``` id: 597287941 first_name: Alexander last_name: Farber gender: male city: Bochum, Germany ``` but then about a minute passes before the segue takes place or sometimes the app even crashes with: ``` 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) ``` What could be the reason for this behaviour please? UPDATE: I have cleaned up the IBOutlets as suggested by Savana (thanks), but the app still crashes: ``` 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) ``` And also when I add an `assert([NSThread isMainThread]);` before the `performSegueWithIdentifier` call, I can see that this is not the main thread... Is being on the main thread a requirement for calling `performSegueWithIdentifier`?

Original source