-1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self getLoadingTableCellWithTableView:tableView];

    RssItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RssItemCell"];
    // If break in here, url fetch maybe error or row is null
    RssItem *feed = [[self.manager.feeds objectForKey:self.manager.currentChannel] objectAtIndex:indexPath.row];

    cell.title.text = feed.title;
    cell.description.text = feed.description;
    cell.date.text = feed.date;
    // if any image enclosure at rss parse
    [cell.enclosure setImage:[UIImage imageNamed:@"logo.png"]];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue,
                   ^{
                       UIImage *image = [[UIImage alloc] initWithData:feed.enclosure];
                       [cell.enclosure  setImage:image];
                       [cell setNeedsLayout];
                   });

    return cell;
}

当我尝试获取 RSS 的空行时遇到问题(我的网络类别上没有帖子)

我想显示警报并自动转到主页。

卡在这里。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self getLoadingTableCellWithTableView:tableView];

    RssItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RssItemCell"];
    @try {
        NSLog(@"Trying to tetch");
        // If break in here, url fetch maybe error or empty row
        RssItem *feed = [[self.manager.feeds objectForKey:self.manager.currentChannel] objectAtIndex:indexPath.row];
        cell.title.text = feed.title;
        cell.description.text = feed.description;
        [cell.enclosure setImage:[UIImage imageNamed:@"logo.png"]];

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
        dispatch_async(queue,
                       ^{
                           UIImage *image = [[UIImage alloc] initWithData:feed.enclosure];
                           [cell.enclosure  setImage:image];
                           [cell setNeedsLayout];
                       });

        return cell;

    }
    @catch (NSException *e) {
        NSLog(@"catching %@ reason %@", [e name], [e reason]);
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"%@",e] delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];

        TableViewController *VC = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
        [self presentViewController:VC animated:YES completion:nil];
    }
    @finally {
        NSLog(@"finally");
    }
}

警报不出现并转到断点。我应该如何处理这个错误?

4

1 回答 1

3

首先,您必须始终返回 UITableViewCell* at cellForRowAtIndexPath:。其次,这通常是一种不好的做法(请参阅下面的引用),特别是因为您可能会显示一些警报并TableViewController多次出现。作为一个问题解决方案,似乎没有例外,这让我认为self.manager.feeds实际上是nil.


使用 Objective-C 编程

您不应该使用 try-catch 块来代替 Objective-C 方法的标准编程检查。例如,在 NSArray 的情况下,您应该始终检查数组的计数以确定项目数,然后再尝试访问给定索引处的对象。如果您发出越界请求,objectAtIndex: 方法会引发异常,以便您可以在开发周期的早期发现代码中的错误——您应该避免在交付给用户的应用程序中引发异常。

有关 Objective-C 应用程序中异常的更多信息,请参阅 异常编程主题

于 2013-06-17T10:05:08.333 回答