2014-01-09 3 views
3

Xcode 5.0.2에서 내비게이션 컨트롤러에 간단한 iPhone 응용 프로그램 (소스 코드 사용 가능 at GitHub)을 만들었습니다. 먼저 웹보기에 Facebook oAuth dialog을 표시하고 사용자가 인증 된 그녀의 세부 사항이 가져온 한 - DetailViewController를 밀어하려고 :performSegueWithIdentifier가 실행 또는 충돌하는 데 1 분 이상 걸림

나는 SEGUE segue라고하고 다음 코드에 의해 ViewController.m에 밀어 넣습니다 위의 스토리 보드에서

storyboard screenshot

:

,542,338,572,

페이스 북의 사용자 데이터가 가져온 괜찮 거의 즉시 인쇄 :

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

를하지만 그때 SEGUE이 발생하거나 때로는 응용 프로그램도 함께 충돌하기 전에 분 통과에 대해 :

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) 

무엇 이 행동에 대한 이유가 될 수 있습니까?

UPDATE : 사바나 (감사)에 의해 제안 내가 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) 

또한 내가 추가 할 때 performSegueWithIdentifier 호출하기 전에 assert([NSThread isMainThread]); , 이것이 주 스레드가 아닌 것을 볼 수 있습니다 ...

performSegueWithIdentifier을 호출하기위한 주 스레드가 필요합니까?

+1

문제가 DetailViewController에 있습니다. 몇 가지가 될 수 있습니다 ...하지만 처음에는 DetailViewController의 IBOutlets 및 IBActions를 확인하여 존재하지 않는 IBOutlet 또는 IBAction에 연결되어 있지 않은지 확인합니다. –

답변

11

스토리 보드에서 ID를 함께 IBOutlet을 삭제, 코드가 없습니다했다 내 문제 (지연 또는 응용 프로그램이 심지어 충돌 후 표시되는 세부보기 컨트롤러)이 코드 :

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

제안 사항으로, UI 관련 호출을 주류가 아닌 대기열에 사용하지 마십시오. –

1

enter image description here 나는 다운로드 먼저 용자 ID하는 텍스트 필드 및 ID에서 당신의 이야기 자세히보기 컨트롤러 보드 거기와 출구를 확인하지만 함께 IBOutlet 내가 해결할 수 있었다

+0

감사합니다. -하지만 나는 아직 그 콘센트를 사용하지 않습니다. (단지 'NSLog'로 데이터를 출력하십시오). 페이스 북 콜백에서'performSegueWithIdentifier'를 호출했기 때문에 스레드 문제일까요? –

+0

모든 것이 잘되고, 콘센트를 제거하고 매력처럼 작동합니다. – savana