根据Web服务响应使用NSFetchresultController删除行/选择?

时间:2013-09-01 09:35:35

标签: ios objective-c web-services uitableview nsfetchedresultscontroller

我正在使用NSFetchrequestController来更新带有核心数据的tableview。当我删除行/部分时,我暂时将其删除状态并将其发送到带有标记的Web服务。

subtask.status = DELETED; //status = 4;

完整的方法就在这里。

MainTableViewCell *cell = (MainTableViewCell*)btn.superview.superview;
self.selectedIndexPath = [self.tableView indexPathForCell:cell];

Task *tobeUpdatedTask;
[popover dismissPopoverAnimated:YES];

if (btn.titleLabel.tag == 8) { //Deleting Main Task/Section
    NSUInteger index = [self.sectionViewIndexMapping indexOfObject:btn.superview];
    if (index == NSNotFound){
        [self showAlert:@"Error Occured! Unable to find index of the section. Please go back to refresh data." WithTitle:ALERT];
        [self.tableView reloadData];
        [self.roundedButtonMenu removeFromSuperview];
        return;
    }
    if ([[self.krFetchedResultsController sections] count] <= index) {
        [self showAlert:@"Error Occured! Unable to find index of the section. Please go back to refresh data." WithTitle:ALERT];
        [self.tableView reloadData];
        [self.roundedButtonMenu removeFromSuperview];
        return;
    }
    id <KRFetchedResultsSectionInfo> si = [[self.krFetchedResultsController sections] objectAtIndex:index];

    Task *task = (Task *)si.theManagedObject;
    tobeUpdatedTask = task;
    if ([task.status isEqualToString:NEW]) {
        //[self.tableView beginUpdates];
        [self.managedObjectContext  deleteObject:si.theManagedObject];
    }else {
        task.status = DELETED;
        for (SubTask *st in task.subTasks) {
            st.status = DELETED;
        }
    }

}else { //Delete SubTask

    //FIXME: deleting countinously will kill the app. dismissing popover might work.
    if (self.selectedIndexPath == NULL) {
        NSLog(@"Unable to find index subtask object. Oops");
        return;
    }

    SubTask *subtask = [self.krFetchedResultsController objectAtIndexPath:self.selectedIndexPath];
    tobeUpdatedTask = subtask.section;

    if ([subtask.status isEqualToString:NEW]) {
        [self.managedObjectContext deleteObject:[self.krFetchedResultsController objectAtIndexPath:self.selectedIndexPath]];
    }else{
        subtask.status = DELETED;
        subtask.section.status = EDITED;
    }
}

//Remove rounded-menu if exists
[self.roundedButtonMenu removeFromSuperview];
[self.overlayView removeFromSuperview];

[self refreshDatesAndPercentage:tobeUpdatedTask];
[self save];
[self createGanttViewData:nil];
[self.tableView reloadData];

根据网络服务响应,我通过特定的子任务ID获取该对象,如下面的代码片段,永久删除它。

NSArray *array = [self fetchObjectByEntityType:entityType byTaskID:[taskDic valueForKey:@"task_id"]]; // task_id from JSON dictionary
[self.managedObjectContext deleteObject:[array objectAtIndex:0]];
[self save];

然而,这有时很好,但大多数时候应用程序崩溃,并在控制台中出现以下错误日志!

* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'无效更新:无效的节数。更新后的表视图中包含的节数(4)必须等于更新前的表视图中包含的节数(4),加上或减去插入或删除的节数(插入0,1删除)。“

我知道这是因为没有正确更新tableview行/部分。但我已经尝试了一切可能的方法来使事情正确。请告诉我这里可能缺少什么或我的方法!提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果您使用的是获取的结果控制器,那么您应该成为其委托并使用委托方法更新UI。如果你这样做,你应该只是从商店中删除对象并允许FRC完成它的工作。执行删除操作时,您无需自己致电reloadData

除了:

使用btn.superview.superview不是获取单元格的可靠方法。它现在可能会起作用,但它不会永远有效。