下载JSON异步崩溃

时间:2017-07-18 07:55:52

标签: ios objective-c json crash

我使用AFNetworking 3在json中下载我的Firebase数据库。一切正常但函数cellForRoAtIndexPath出现崩溃。 感谢

工作:

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 * 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"
  }
}

记录崩溃:

- [ NSDictionaryI objectAtIndex:]:无法识别的选择器发送到实例0x61000086c8c0 2017-07-18 10:00:26.787 jojol67 [7003:4420828] ***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [__ NSDictionaryI objectAtIndex:]:无法识别的选择器已发送例如0x61000086c8c0' ***第一次抛出调用堆栈: (     0 CoreFoundation 0x000000010c084b0b __exceptionPreprocess + 171     1 libobjc.A.dylib 0x000000010e5c9141 objc_exception_throw + 48     2 CoreFoundation 0x000000010c0f4134 - [NSObject(NSObject)doesNotRecognizeSelector:] + 132     3 CoreFoundation 0x000000010c00b840 ___转发_ + 1024     4 CoreFoundation 0x000000010c00b3b8 _CF_forwarding_prep_0 + 120     5 jojol67 0x000000010756db3f - [DEMOConcoursTableViewController collectionView:cellForItemAtIndexPath:] + 191     6 UIKit 0x000000010d162925 - [UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:isFocused:notify:] + 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 main + 111     24 libdyld.dylib 0x000000010f31d65d start + 1     25 ??? 0x0000000000000001 0x0 + 1 ) libc ++ abi.dylib:以NSException类型的未捕获异常终止

/////// Firebase实时数据库////////

enter image description here

4 个答案:

答案 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"
}]

答案 1 :(得分: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"
  }
]

答案 2 :(得分:0)

" - [NSDictionaryI objectAtIndex:]:无法识别的选择器发送到实例0x61000086c8c0" 似乎 self.contestArray NSDictionary类;

您可以记录 responseObject 它可能是Dictionary,而不是Array;

答案 3 :(得分:0)

它会帮助你做出这样的回应:

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
}