2017-07-18 18 views
0

AFNetworking 3でjsonでFirebaseデータベースをダウンロードします。すべてうまくいきますが、関数cellForRoAtIndexPathにクラッシュがあります。 おかげJSON非同期クラッシュをダウンロード

仕事:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
    [manager GET:@"https://jojol-concours-lists.firebaseio.com/.json" parameters:URLParameters progress:nil success:^(NSURLSessionTask *task, id responseObject) { 

     self.contestArray = responseObject; 

     [_collectionView reloadData]; 
    } failure:^(NSURLSessionTask *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 

仕事:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
    return [self.contestArray count]; 
} 

動作しない場合:(NSDictionaryの*配列= [self.contestArray objectAtIndex:indexPath.row];)

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
         cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

     DemoCollectionViewCell *retVal = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionViewCell" 
                        forIndexPath:indexPath]; 

//////// Not work /////// 
     NSDictionary *array = [self.contestArray objectAtIndex:indexPath.row]; 
//////// Not work /////// 

     retVal.name.text = @""; 

     retVal.contentView.layer.cornerRadius = 10; 
     retVal.contentView.layer.masksToBounds = YES; 

     return retVal; 
    } 

JSON:

{ 
    "Concours-1" : { 
    "Description" : "Description du concours", 
    "Title" : "Titre" 
    }, 
    "Concours-2" : { 
    "Description" : "Description du concours", 
    "Titre" : "iPhone 6" 
    } 
} 

ログのクラッシュ:

- [NSDictionaryI objectAtIndex:]:00:26.787 jojol67認識されないセレクターがインスタンス0x61000086c8c0に 2017年7月18日10送信[7003:4420828] ***アプリの終了によりキャッチされないと例外 'NSInvalidArgumentException'、理由: ' - [__ NSDictionaryI objectAtIndex:]:認識されていないセレクタはインスタンス0x61000086c8c0に送られた' ***まずスローコールスタック: ( 0 CoreFoundationの0x000000010c084b0b __exceptionPreprocess + 171 1 libobjc.A.dylib 0x000000010e5c9141 objc_exception_throw + 48 2 CoreFoundation 0x000000010c0f4134 - [NSObje CT(NSObjectの)doesNotRecognizeSelector:] + 132 3 CoreFoundationの0x000000010c00b840 ___forwarding_ + 1024 4 CoreFoundationの0x000000010c00b3b8 _CF_forwarding_prep_0 + 120 5 jojol67 0x000000010756db3f - [DEMOConcoursTableViewController collectionView:cellForItemAtIndexPath:] + 191 6のUIKit 0x000000010d162925 - [UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes :通知:isFocused] + 446 7のUIKit 0x000000010d162761 - [UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:] + 35 8のUIKit 0x000000010d1679bd - [UICollectionView _updateVisibleCellsNow:] + 4764 9のUIKit 0x000000010d16d38e - [UICollectionView layoutSubviews] + 313 10のUIKit 0x000000010c8f355b - [UIViewの(CALayerDelegate)layoutSublayersOfLayer:] + 1268 11 QuartzCore 0x000000010c6a4904 - [CALayerのlayoutSublayers] + 146 12 QuartzCore 0x000000010c698526 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 370 13 QuartzCore 0x000000010c6983a0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 14 QuartzCore 0x000000010c627e92 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294 15 QuartzCore 0x000000010c654130 _ZN2CA11Transaction6commitEv + 468 16 QuartzCore 0x000000010c654b37 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 115 17 CoreFoundationの0x000000010c02a717 CFRUNLOOP_IS _CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23 18 CoreFoundationの0x000000010c02a687 __CFRunLoopDoObservers + 391 19 CoreFoundationの0x000000010c00f720 __CFRunLoopRun + 1200 20 CoreFoundationの0x000000010c00f016 CFRunLoopRunSpecific + 406 21 GraphicsServices 0x00000001103c2a24 GSEventRunModal + 62 22のUIKit 0x000000010c830134 UIApplicationMain + 159 23 jojol67 0x000000010752ef5fメイン+ 111 24 libdyld。dylib 0x000000010f31d65d start + 1 25? 0x0000000000000001は0x0 + 1 ) のlibC++ abi.dylib:NSException

タイプのキャッチされない例外で終端

/////// Firebaseリアルタイムデータベース

enter image description here

////////
+0

クラッシュを=>これで、クラッシュログを持っていますか? – Larme

+0

エラーメッセージは明示的で、JSON構造体で確認されています。JSONは配列ではなくトップレベルのNSDictionaryです。 – Larme

+0

あなたのself.contestArrayはNSArrayではないので、NSDictionary * array = [self.contestArray objectForKey: "key"];でアクセスする必要があります。 NSLog(@ "%@"、self.contestArray)を使用してself.contestArrayのキーと値を確認してください。 –

答えて

0

それは、このようなresponceのためのお手伝いを致します。

NSDictionary *jsonDict =responseObject; 

NSArray *allKeys = [jsonDict allKeys]; 
NSMutableArray *allDataArray = [NSMutableArray new]; 
for (int x = 0; x<allKeys.count; x++) { 
    NSString *key = [allKeys objectAtIndex:x]; 
    [allDataArray addObject:[jsonDict valueForKey:key]]; 

    // then reload your collection on allDataArray 
} 
+0

@victorbillこれを試してみてください。 –

+0

ありがとう、それは動作:) –

3

id responseObjectは、JSONに配列ではないオブジェクトが含まれているため、配列ではありません。 NSDictionaryオブジェクトでobjectAtIndexを呼び出すため、アプリケーションがクラッシュします。

あなたは配列としてこのJSONにアクセスしたい場合、あなたはこのような何かにそれをフォーマットしたいことがあり、

[{ 
    "Concours": 1, 
    "Description": "Description du concours", 
    "Title": "Titre" 
}, { 
    "Concours": 2, 
    "Description": "Description du concours", 
    "Titre": "iPhone 6" 
}] 
+0

それではどうすればいいですか?ありがとう –

+0

@victorbill私はより多くの情報を追加しました。 – sleepwalkerfx

+0

@sleepwalkerfx "Concours-1"と "Concours-2"は、内部オブジェクトの値ではなく、Objectで区切られています...これらはメインオブジェクトです –

0

現在のJSON:

{ 
    "Concours-1" : { 
    "Description" : "Description du concours", 
    "Title" : "Titre" 
    }, 
    "Concours-2" : { 
    "Description" : "Description du concours", 
    "Titre" : "iPhone 6" 
    } 
} 

それがあるべき方法:

[ 
    { 
    "Description": "Description du concours", 
    "Title": "Titre" 
    }, 
    { 
    "Description": "Description du concours", 
    "Titre": "iPhone 6" 
    } 
] 
0

" - [NSDictionaryI objectAtIndex:]:認識できないセレクタがインスタンス0x61000086cに送信されました8c0 " self.contestArrayNSDictionaryクラスと思われます。

レスポンスオブジェクトは、配列ではなく辞書である可能性があります。

関連する問題