2014-10-06 57 views
0

我想添加批註到地圖視圖。每個註釋代表一條推文。我從twitter api獲取每條推文的座標。加載地圖後,該應用程序正在崩潰。我不知道爲什麼。應用程序崩潰與NSInvalidArgumentException

編輯:這是當前版本的相關代碼。它運行良好,直到tweetLocation爲空的推文。然後它崩潰。

STTwitterAPI *twitter = [STTwitterAPI twitterAPIAppOnlyWithConsumerKey:@"key" consumerSecret:@"secret"]; 

    [twitter verifyCredentialsWithSuccessBlock:^(NSString *username) { 

     [twitter getSearchTweetsWithQuery:@"apple" geocode:geoCode lang:nil locale:nil resultType:@"recent" count:@"10" until:nil sinceID:nil maxID:nil includeEntities:nil callback:nil successBlock:^(NSDictionary *searchMetadata, NSArray *statuses) { 

      tweetsArray = [NSMutableArray arrayWithArray:statuses]; 
      NSLog(@"tweetsArray: %@", tweetsArray); 

      for (int i = 0; i < [tweetsArray count]; i++) { 
       NSDictionary *t = tweetsArray[i]; 
       tweetAnnotation = [[MKPointAnnotation alloc]init]; 

       NSArray *tweetLocation = [[t valueForKey:@"geo"]valueForKey:@"coordinates"]; 
       NSLog(@"Tweet Location: %@", tweetLocation); 

       if ([tweetLocation count] == 0) { 
        continue; 
       } 
       else { 
        double lat = [[tweetLocation objectAtIndex:0]doubleValue]; 
        double longitude = [[tweetLocation objectAtIndex:1]doubleValue]; 
        locationCoord.latitude = lat; 
        locationCoord.longitude = longitude; 

        twitterName = [t valueForKeyPath:@"user.screen_name"]; 
        NSLog(@"Twitter name: %@", twitterName); 
        tweetAnnotation.title = twitterName; 

        tweetAnnotation.coordinate = locationCoord; 
        [tweetLocationsArray addObject:tweetAnnotation]; 
       } 
      } 

      [tweetMap addAnnotations:tweetLocationsArray]; 

     } errorBlock:^(NSError *error) { 

      NSLog(@"%@", error.debugDescription); 

     }]; 

    } errorBlock:^(NSError *error) { 

     NSLog(@"%@", error.debugDescription); 

    }]; 

編輯:這是電流誤差在控制檯:

2014-10-07 08:00:36.278 Tweets By Location[5244:382886] Tweet Location: (
    "37.33158914", 
    "-122.03076495" 
) 
2014-10-07 08:00:36.278 Tweets By Location[5244:382886] Twitter name: tofuhunter 
2014-10-07 08:00:36.278 Tweets By Location[5244:382886] Tweet Location: (
    "37.33161957", 
    "-122.03080173" 
) 
2014-10-07 08:00:36.278 Tweets By Location[5244:382886] Twitter name: treynesss 
2014-10-07 08:00:36.278 Tweets By Location[5244:382886] Tweet Location: (
    "37.33161957", 
    "-122.03080173" 
) 
2014-10-07 08:00:36.279 Tweets By Location[5244:382886] Twitter name: mattlarowe 
2014-10-07 08:00:36.279 Tweets By Location[5244:382886] Tweet Location: <null> 
2014-10-07 08:00:36.279 Tweets By Location[5244:382886] -[NSNull count]: unrecognized selector sent to instance 0x10b0accb0 
2014-10-07 08:00:36.281 Tweets By Location[5244:382886] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull count]: unrecognized selector sent to instance 0x10b0accb0' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010ae043f5 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x000000010aa9dbb7 objc_exception_throw + 45 
    2 CoreFoundation      0x000000010ae0b50d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
    3 CoreFoundation      0x000000010ad637fc ___forwarding___ + 988 
    4 CoreFoundation      0x000000010ad63398 _CF_forwarding_prep_0 + 120 
    5 Tweets By Location     0x000000010a08876e __32-[MapViewController viewDidLoad]_block_invoke_2 + 542 
    6 Tweets By Location     0x000000010a029feb __147-[STTwitterAPI getSearchTweetsWithQuery:geocode:lang:locale:resultType:count:until:sinceID:maxID:includeEntities:callback:successBlock:errorBlock:]_block_invoke + 203 
    7 Tweets By Location     0x000000010a01cd1a __99-[STTwitterAPI getResource:baseURLString:parameters:downloadProgressBlock:successBlock:errorBlock:]_block_invoke117 + 186 
    8 Tweets By Location     0x000000010a0751d8 __95-[STTwitterAppOnly getResource:baseURLString:parameters:progressBlock:successBlock:errorBlock:]_block_invoke104 + 184 
    9 Tweets By Location     0x000000010a065a32 __158+[STHTTPRequest(STTwitter) twitterRequestWithURLString:stTwitterUploadProgressBlock:stTwitterDownloadProgressBlock:stTwitterSuccessBlock:stTwitterErrorBlock:]_block_invoke33 + 722 
    10 Tweets By Location     0x000000010a071538 -[STHTTPRequest connectionDidFinishLoading:] + 472 
    11 CFNetwork       0x00000001105212cc __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke + 69 
    12 CFNetwork       0x0000000110521270 -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:] + 199 
    13 CFNetwork       0x00000001105213d7 -[NSURLConnectionInternal _withActiveConnectionAndDelegate:] + 48 
    14 CFNetwork       0x00000001103f25f7 ___ZN27URLConnectionClient_Classic26_delegate_didFinishLoadingEU13block_pointerFvvE_block_invoke + 107 
    15 CFNetwork       0x00000001104be871 ___ZN27URLConnectionClient_Classic18_withDelegateAsyncEPKcU13block_pointerFvP16_CFURLConnectionPK33CFURLConnectionClientCurrent_VMaxE_block_invoke_2 + 273 
    16 CFNetwork       0x00000001103ddb36 _ZN19RunloopBlockContext13_invoke_blockEPKvPv + 72 
    17 CoreFoundation      0x000000010ad0c714 CFArrayApplyFunction + 68 
    18 CFNetwork       0x00000001103dd9f7 _ZN19RunloopBlockContext7performEv + 133 
    19 CFNetwork       0x00000001103dd836 _ZN17MultiplexerSource7performEv + 256 
    20 CFNetwork       0x00000001103dd64c _ZN17MultiplexerSource8_performEPv + 72 
    21 CoreFoundation      0x000000010ad39ad1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 
    22 CoreFoundation      0x000000010ad2f99d __CFRunLoopDoSources0 + 269 
    23 CoreFoundation      0x000000010ad2efd4 __CFRunLoopRun + 868 
    24 CoreFoundation      0x000000010ad2ea06 CFRunLoopRunSpecific + 470 
    25 GraphicsServices     0x000000010cf2f9f0 GSEventRunModal + 161 
    26 UIKit        0x000000010b277550 UIApplicationMain + 1282 
    27 Tweets By Location     0x000000010a089e43 main + 115 
    28 libdyld.dylib      0x000000010cb78145 start + 1 
    29 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+1

請張貼符號化的堆棧跟蹤和完整的錯誤消息。 – 2014-10-06 18:10:37

+0

請參閱http://raywenderlich.com/10209/my-app-crashed-now-what-part-1 – rmaddy 2014-10-06 18:12:56

+0

您是否已導入MapKit庫? – 2014-10-06 18:16:23

回答

1

元素"coordinates"不是字符串。

根據文檔,你是遍歷對象是資料Tweet對象: https://dev.twitter.com/overview/api/tweets

這樣做的coordinates部分顯示類似於本例中:

"coordinates": 
    [ 
    -75.14310264, 
    40.05701649 
    ] 

你應該解析coordinates作爲陣列代表(經度,緯度)對。

請注意,coordinates可能爲空(與[NSNull null]相比),所以您應該考慮到這一點。

+0

如何獲得每個元素的雙精度值,以便我可以設置經度和緯度? – raginggoat 2014-10-06 18:36:25

+0

它們應該作爲NSArray中的NSNumber對象存儲。使用'[longitude doubleValue]'獲得double值。 – 2014-10-06 18:40:30

+0

我修復了這個問題,但現在由於某種原因沒有收到推文。在解決崩潰問題之前,我至少得到了這些人。 – raginggoat 2014-10-06 18:51:50

1

這條線從崩潰日誌:

2014-10-06 14:18:08.622 Tweets By Location[3612:174001] -[__NSCFArray length]: unrecognized selector sent to instance 0x7fa983d03510 

,你要發送length到一個數組手段,但數組沒有稱爲length的方法。

原因是這樣的代碼:

NSString *tweetLocation = [[t valueForKey:@"geo"]valueForKey:@"coordinates"]; 
NSLog(@"Tweet Location: %@", tweetLocation); 

if ([tweetLocation length] == 0) { 
    continue; 
} 

你假設,無論在geo.coordinates的是一個字符串,但服務器返回一個數組。

要修復它,請查看服務器應返回的規範,並調整您的代碼以符合規範。如果服務器可能返回該字段的數組或字符串,則可以使用isKindOfClass:來測試在運行時返回的內容。

0

我想通了它爲什麼會崩潰。我不得不檢查座標JSON數組是否等於NSNull。

if ([tweetLocation isEqual:[NSNull null]]) { 
        continue; 
       } 
       else { 
        double lat = [[tweetLocation objectAtIndex:0]doubleValue]; 
        double longitude = [[tweetLocation objectAtIndex:1]doubleValue]; 
        locationCoord.latitude = lat; 
        locationCoord.longitude = longitude; 
        NSLog(@"Lat: %.8f, Long: %.8f", lat, longitude); 

        twitterName = [t valueForKeyPath:@"user.screen_name"]; 
        NSLog(@"Twitter name: %@", twitterName); 
        tweetAnnotation.title = twitterName; 

        tweetAnnotation.coordinate = locationCoord; 
        [tweetLocationsArray addObject:tweetAnnotation]; 
       } 
+0

如果您發現我的答案是正確的,請將其標記爲已接受。謝謝。 – 2014-10-07 16:19:18

相關問題