发布CoreData对象的UITableView

时间:2015-12-31 03:30:31

标签: ios objective-c uitableview core-data magicalrecord

我对tableview及其数据有一个奇怪的问题。我有一个很长的,大约253个国家/地区的对象列表(NSManagedObjects)作为填充表格的数据源。

VC上的属性被定义为强属性:

@property (nonatomic, strong) NSArray *originalCountries;
@property (nonatomic, strong) NSArray *countries;

我有一些过滤逻辑,这就是拥有这两个数组的原因。

这真的很奇怪但是对于调试器来说,用作数据源的countries数组有253个对象(类型为Country),但是对象的属性都是nil,为此表变为“空”。

这里是调试器的捕获:enter image description here

我的直觉说,一段时间后,“垃圾收集器”正在释放这些物品,但我不确定。我很好奇,阵列上的每个桶都指向一个Country对象,而不是直接为nil。这对你好奇吗?问题是,要选择(或不选择)大量国家/地区,用户需要一些时间来完成此操作,我丢失了表格数据。

我正在使用魔法记录来检索对象:

self.countries = [Country MR_findAllSortedBy:@"name" ascending:YES];
self.originalCountries = [Country MR_findAllSortedBy:@"name" ascending:YES];

如果我将原始国家作为国家的可变副本,获得释放对象所花费的时间甚至更低。 :(

鉴于此,问题是: - 您如何看待这种情况?我已经搜索了很多类似的问题,但我没有找到任何东西。 - 有没有办法对“垃圾收集器”说不要太快释放这个对象? - 也许我在表视图的实现上遗漏了一些东西?我可以分享一些额外的代码,以补充最后一个问题。

非常感谢你阅读这篇文章。任何形式的帮助都非常感谢。祝所有人新年快乐。

编辑1(更多与UITableView委托和数据源相关的代码):

#pragma mark UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.countries.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NextTripsCountriesListTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath];

    cell.arrowImageView.hidden = YES;

    Country *c = [self.countries objectAtIndex:indexPath.row];

    cell.countryLabel.text = [c.name uppercaseString];
    cell.flagImageView.image = [UIImage imageWithData:c.flag];

    cell.numberOfDestinationsLabel.hidden = YES;

    if ([self.selectedCountries containsObject:c]) {
        cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"check"]];
        cell.accessoryView.tintColor = [UIColor colorWithHexString:@"#f95a30"];
    } else {
        cell.accessoryView = nil;
    }
    return cell;
}

#pragma mark UITableViewDelegate

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    // Remove seperator inset
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }

    // Explictly set your cell's layout margins
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    return cell.bounds.size.height;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    Country *c = [self.countries objectAtIndex:indexPath.row];
    if (self.configureForSingleSelection) {
        cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"check"]];
        cell.accessoryView.tintColor = [UIColor colorWithHexString:@"#f95a30"];
        [self.selectedCountries addObject:c];
        self.doneActionBlock(self.selectedCountries);
        [self.popupController dismiss];
    }
    else {
        if ([self.selectedCountries containsObject:c]) {
            [self.selectedCountries removeObject:c];
            cell.accessoryView = nil;
        } else {
            cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"check"]];
            cell.accessoryView.tintColor = [UIColor colorWithHexString:@"#f95a30"];
            [self.selectedCountries addObject:c];
        }
    }
}

0 个答案:

没有答案