gpt4 book ai didi

ios - Objective-c Json 解析空数组错误或 Bug?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:11:10 24 4
gpt4 key购买 nike

当我用 tableview 解析 json 时,如果有 json 项,一切都很好,但如果没有加载 json 项,当我单击后退按钮时,会出现此错误。

erminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
*** First throw call stack:

我认为当我快速单击后退按钮时 json 不会加载,并在我的 TableView 代码下给出此错误。

    @interface MasterViewController ()

@property (nonatomic, assign) NSInteger currentPage;
@property (nonatomic, assign) NSInteger totalPages;
@property (nonatomic, assign) NSInteger totalItems;
@property (nonatomic, assign) NSInteger maxPages;

@property (nonatomic, strong) NSMutableArray *activePhotos;
@property (strong, nonatomic) NSMutableArray *staticDataSource;
@property (nonatomic, strong) NSMutableArray *searchResults;

@property (strong, nonatomic) IBOutlet UITableView *tableView;


@end


- (void)viewDidLoad
{
[super viewDidLoad];

self.activePhotos = [[NSMutableArray alloc] init];
self.searchResults = [[NSMutableArray alloc] init];
self.staticDataSource = [[NSMutableArray alloc] init];


}


#pragma mark - Table View

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return self.activePhotos.count;
}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell;
if (indexPath.row == [self.activePhotos count]) {
cell = [self.tableView dequeueReusableCellWithIdentifier:@"LoadingCell" forIndexPath:indexPath];
UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *)[cell.contentView viewWithTag:100];
[activityIndicator startAnimating];
} else {
NSDictionary *photoItem = self.activePhotos[indexPath.row];
cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

cell.textLabel.text = [photoItem objectForKey:@"name"];
if (![[photoItem objectForKey:@"description"] isEqual:[NSNull null]]) {
cell.detailTextLabel.text = [photoItem objectForKey:@"description"];
}


}


return cell;
}



- (void)loadPhotos:(NSInteger)page
{



NSString *userismim =[[NSUserDefaults standardUserDefaults] stringForKey:@"userisim"];


NSArray* words = [userismim componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString* nospacestring = [words componentsJoinedByString:@""];


NSLog(@"%@",nospacestring);


NSString *apiURL = [NSString stringWithFormat:@"http://bla.com/server/table.php?user=%@",nospacestring];

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:apiURL]
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {

if (!error) {

NSError *jsonError = nil;
NSMutableDictionary *jsonObject = (NSMutableDictionary *)[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];

NSLog(@"%@",jsonObject);

[self.staticDataSource addObjectsFromArray:[jsonObject objectForKey:@"photos"]];

self.currentPage = [[jsonObject objectForKey:@"current_page"] integerValue];
self.totalPages = [[jsonObject objectForKey:@"total_pages"] integerValue];
self.totalItems = [[jsonObject objectForKey:@"total_items"] integerValue];

self.activePhotos = self.staticDataSource;

dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
}] resume];
}

谢谢你所做的一切。我需要你的帮助。

最佳答案

您正在显示事件指示器,它将一直旋转直到 json 加载。

如果您在 json 加载之前按下后退按钮,应用会尝试分配空引用给数组,这是不可能的,因此它会抛出错误。

为避免这种情况,您可以在请求发出后停止 userInteraction,并仅在获得成功或失败响应后才启用。

要禁用交互,添加

[[UIApplication sharedApplicaton] beginIgnoringInteractionEvents]  

之后

NSURLSession *session = [NSURLSession sharedSession];

要再次启用,请添加:

 [[UIApplication sharedApplicaton] endIgnoringInteractionEvents]  

之前

if (!error) {

我希望这会解决您的问题。

关于ios - Objective-c Json 解析空数组错误或 Bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34019787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com