2017-07-18 1 views
0

Je télécharge ma base de données Firebase dans json avec AFNetworking 3. Tout fonctionne bien mais il y a un crash dans la fonction cellForRoAtIndexPath. MerciTélécharger JSON async crash

travail:

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); 
    }]; 

travail:

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

ne fonctionnent pas de: (NSDictionary * array = [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" 
    } 
} 

Log crash:

- [NSDictionaryI objectAtIndex:]: sélecteur non reconnu envoyé à l'instance 0x61000086c8c0 18/07/2017 10: 00: 26,787 jojol67 [7003: 4.420.828] *** en raison de l'application Mettre fin uncaught exception 'NSInvalidArgumentException', raison: '- [__ NSDictionaryI objectAtIndex:]: sélecteur non reconnu envoyé à l'instance 0x61000086c8c0' *** Première pile d'appel de jet: (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: notifier:] + 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 principal + 111 24 libdyld.dylib 0x000000010f31d65d start + 1 25 ??? 0x0000000000000001 0x0 + 1 ) libC++ abi.dylib: mettre fin à l'exception de uncaught de type NSException

/////// base de données en temps réel Firebase ////////

enter image description here

+0

Un accident => Vous avez un journal crash alors? – Larme

+0

Le message d'erreur est explicite et confirmé avec la structure JSON: votre JSON est un NSDictionary au niveau supérieur, pas un tableau. – Larme

+0

votre self.contestArray est NSDictionary pas NSArray donc vous devez accéder avec NSDictionary * array = [self.contestArray objectForKey: "key"]; utilisez NSLog (@ "% @", self.contestArray) pour voir les clés et les valeurs de self.contestArray –

Répondre

0

Il vous aidera à cette 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 Essayez ceci cela va sûrement résoudre votre problème. –

+0

Merci beaucoup, ça marche :) –

3

Votre id responseObject n'est pas un tableau car votre fichier JSON contient un objet et non un tableau. L'application se bloque parce que vous appelez objectAtIndex sur un objet NSDictionary.

Si vous souhaitez accéder à cette JSON comme un tableau, vous pouvez formater à quelque chose comme ça,

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

Alors, comment faisons-nous cela? Merci –

+0

@victorbill J'ai ajouté plus d'informations. – sleepwalkerfx

+0

@sleepwalkerfx "Concours-1" et "Concours-2" sont séparés Objet, pas pour la valeur des objets internes ... il s'agit de l'objet principal –

0

JSON actuel:

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

Comment ça devrait être:

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

"- [NSDictionaryI objectAtIndex:]: sélecteur non reconnu envoyé à l'instance 0x61000086c 8c0 " Il semble que le self.contestArray est NSDictionary class;

Vous pouvez enregistrer le responseObject peut-être un dictionnaire, pas Array;