2015-08-28 5 views
0

Я получаю сообщение об ошибке SIGABRT ABORT в строке, указанной ниже комментария (пусть данные = fbResult.objectForKey ("data") as! NSMutableArray). Я просто пытаюсь получить счет пользователя, накопленный за Facebook. Обратите внимание, что я не могу воспроизвести эту проблему, и это происходит на очень немногих устройствах. Я просто получил проблему через отчеты о сбоях.SIGABRT ABORT crash on iOS swift

var fbScore = 0 
func getFBScore(){ 
    if(FBSDKAccessToken.currentAccessToken() != nil){ 
     var request = FBSDKGraphRequest(graphPath: "me/scores?fields=score", parameters: nil) 
     request.startWithCompletionHandler({(connection, result, error) -> Void in 
      if(error != nil){ 
       println("facebook score reading failed with error \(error)") 

      } else { 
       println("facebook score reading result \(result)") 
       let fbResult = result as! NSDictionary 
       //crash on below line 
       let data = fbResult.objectForKey("data") as! NSMutableArray 
       if(data.count == 0){ 
        self.postFBScore(0) 
       } else { 
        if let mScore = data[0].objectForKey("score") as? Int{ 
         self.fbScore = mScore 
         println("facebook score is \(self.fbScore)") 
        } else{ 
         self.postFBScore(0) 
        } 

       } 
      } 

     }) 
    } 
} 

Это сообщение об аварии, которое я получил.

 

    Thread : Crashed: com.apple.main-thread 
    0 libsystem_kernel.dylib   0x00000001954db270 __pthread_kill + 8 
    1 libsystem_pthread.dylib  0x0000000195579160 pthread_kill + 112 
    2 libsystem_c.dylib    0x0000000195452aa0 abort + 112 
    3 libswiftCore.dylib    0x0000000100a6dd80 swift::fatalError(char const*, ...) + 182 
    4 libswiftCore.dylib    0x0000000100a4aefc swift::swift_dynamicCastFailure(void const*, char const*, void const*, char const*, char const*) + 70 
    5 libswiftCore.dylib    0x0000000100a4af80 swift::swift_dynamicCastFailure(swift::Metadata const*, swift::Metadata const*, char const*) + 130 
    6 libswiftCore.dylib    0x0000000100a6f6dc swift_dynamicCastObjCClassUnconditional + 72 
    7 MY_APP      0x00000001000e5c70 MY_APP.GameScene.(getFBScore (MY_APP.GameScene) ->() ->()).(closure #1) (GameScene.swift:1600) 
    8 MY_APP      0x00000001003d6ea4 -[FBSDKGraphRequestMetadata invokeCompletionHandlerForConnection:withResults:error:] (FBSDKGraphRequestMetadata.m:48) 
    9 MY_APP      0x00000001003ddef0 __82-[FBSDKGraphRequestConnection processResultBody:error:metadata:canNotifyDelegate:]_block_invoke394 (FBSDKGraphRequestConnection.m:719) 
    10 MY_APP      0x00000001003ddca0 -[FBSDKGraphRequestConnection processResultBody:error:metadata:canNotifyDelegate:] (FBSDKGraphRequestConnection.m:768) 
    11 MY_APP      0x00000001003dd768 __64-[FBSDKGraphRequestConnection completeWithResults:networkError:]_block_invoke (FBSDKGraphRequestConnection.m:697) 
    12 CoreFoundation     0x00000001832b0d48 __53-[__NSArrayM enumerateObjectsWithOptions:usingBlock:]_block_invoke + 132 
    13 CoreFoundation     0x00000001832b0c2c -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 312 
    14 MY_APP      0x00000001003dd500 -[FBSDKGraphRequestConnection completeWithResults:networkError:] (FBSDKGraphRequestConnection.m:679) 
    15 MY_APP      0x00000001003dc950 -[FBSDKGraphRequestConnection completeFBSDKURLConnectionWithResponse:data:networkError:] (FBSDKGraphRequestConnection.m:544) 
    16 MY_APP      0x00000001003da910 __36-[FBSDKGraphRequestConnection start]_block_invoke_2 (FBSDKGraphRequestConnection.m:188) 
    17 MY_APP      0x00000001003d76ec -[FBSDKURLConnection invokeHandler:error:response:responseData:] (FBSDKURLConnection.m:104) 
    18 MY_APP      0x00000001003d7644 -[FBSDKURLConnection logAndInvokeHandler:response:responseData:] (FBSDKURLConnection.m:96) 
    19 MY_APP      0x00000001003d7a28 -[FBSDKURLConnection connectionDidFinishLoading:] (FBSDKURLConnection.m:143) 
    20 CFNetwork      0x0000000182e391e8 __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke + 80 
    21 CFNetwork      0x0000000182e39178 -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:] + 208 
    22 CFNetwork      0x0000000182e392f4 -[NSURLConnectionInternal _withActiveConnectionAndDelegate:] + 60 
    23 CFNetwork      0x0000000182d0bdfc ___ZN27URLConnectionClient_Classic26_delegate_didFinishLoadingEU13block_pointerFvvE_block_invoke + 104 
    24 CFNetwork      0x0000000182dd6120 ___ZN27URLConnectionClient_Classic18_withDelegateAsyncEPKcU13block_pointerFvP16_CFURLConnectionPK33CFURLConnectionClientCurrent_VMaxE_block_invoke_2 + 104 
    25 CFNetwork      0x0000000182cf7efc RunloopBlockContext::_invoke_block(void const*, void*) + 76 
    26 CoreFoundation     0x000000018329c97c CFArrayApplyFunction + 68 
    27 CFNetwork      0x0000000182cf7da8 RunloopBlockContext::perform() + 136 
    28 CFNetwork      0x0000000182cf7c5c MultiplexerSource::perform() + 312 
    29 CFNetwork      0x0000000182cf7a88 MultiplexerSource::_perform(void*) + 68 
    30 CoreFoundation     0x0000000183373f8c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24 
    31 CoreFoundation     0x0000000183373230 __CFRunLoopDoSources0 + 264 
    32 CoreFoundation     0x00000001833712e0 __CFRunLoopRun + 712 
    33 CoreFoundation     0x000000018329cf74 CFRunLoopRunSpecific + 396 
    34 GraphicsServices    0x000000018cba76fc GSEventRunModal + 168 
    35 UIKit       0x0000000187e9ed94 UIApplicationMain + 1488 
    36 MY_APP      0x00000001000f6c58 main (AppDelegate.swift:16) 
    37 libdyld.dylib     0x00000001953c2a08 start + 4 

Когда я пытаюсь распечатать fbResult на моей консоли, это то, что я получаю.

{ данные = ( { оценка = 41; пользователь = { ID = 10206371034343540; имя = "Рохит Гоял"; }; } ); }

+0

Вы подавляете fbResult.objectForKey («данные») как NSMutableArray. Если известно, что словарь содержит только экземпляры NSMutableArray, вы можете сбрасывать и разворачивать непосредственно в необязательный NSMutableArray с принудительной версией оператора литья типа (как!): Вы можете распечатать fbResult в консоли и поделиться им? –

+0

ключ 'data' является массивом? Распечатайте консоль результатов здесь или если она долгое время использует пасти. –

+0

@ Prabhu.Somasundaram Вот он. { данные = ( { оценка = 41; пользователь = { ID = 10206371034343540; имя = "Рохит Гоял"; }; } ); } –

ответ

1

Поскольку исключение в этой строке:

let data = fbResult.objectForKey("data") as! NSMutableArray 

, учитывая тот факт, что Swift является язык сильно и статический типизированными, единственно возможной причиной ошибки является использование оператора ! для литья объекта к типу NSMutableArray. Таким образом, если вы знаете, что значение, связанное с ключом data является массивом, вы должны попытаться привести его к не изменяемый массив:

let data = fbResult.objectForKey("data") as! NSArray 
0

Попробуйте заменить его следующим образом:

Текущий:

let data = fbResult.objectForKey("data") as! NSMutableArray 

Новый:

let data = fbResult.objectForKey("data").mutablecopy() as! NSMutableArray