0

我刚刚重写了这篇文章,涵盖了我能想到的每一个可能的角度。我不知道为什么这会崩溃。也许有人可以帮我弄清楚。

这是 cellForRowAtIndexPath 代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    JHomeViewCell *cell = (JHomeViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[JHomeViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                    reuseIdentifier:CellIdentifier];
        cell.delegate = self;
    }

    cell.cellContent.cellInfo = [self cellInfoForCellAtIndexPath:indexPath];
    if (cell.cellContent.cellInfo.thumbnailsComplete == YES || cell.cellContent.cellInfo.thumbnailsBeingCreated == YES) {
        [cell.cellContent setNeedsDisplay];
    }
    else {
        [cell.cellContent setup];
    }


    return cell;
}

在 cellContent 中,有这个设置方法:

-(void)setup {

    [self setNeedsDisplay];

    self.cellInfo.thumbnailsBeingCreated = YES;

    NSManagedObjectID *entryID = self.cellInfo.objectID;

    dispatch_queue_t cellSetupQueue = dispatch_queue_create("com.Journalized.SetupCell", NULL);
    dispatch_async(cellSetupQueue, ^{
        NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init];

        NSPersistentStoreCoordinator *coordinator = [[CoreDataStore mainStore] context].persistentStoreCoordinator;

        [newMoc setPersistentStoreCoordinator:coordinator];
        NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
        [notify addObserver:self 
                   selector:@selector(mergeChanges:) 
                       name:NSManagedObjectContextDidSaveNotification 
                     object:newMoc];

        Entry *entry = (Entry *)[newMoc objectWithID:entryID];

        [newMoc save:nil];
        int i = 0;

        while (i < self.cellInfo.numberOfThumbnailsToDraw) {
        NSLog(@"number of thumbnails: %i %i %i", self.cellInfo.numberOfThumbnailsToDraw, entry.media.count, i);
            Media *media = [entry.media objectAtIndex:i];
            UIImage *image = [media getThumbnail];

            BOOL success = [newMoc save:nil];

            //NSLog(@"time: %@ success: %i", entry.entryTableInfo.creationTimeString, success);

            [self.cellInfo.thumbnails setObject:image forKey:[NSNumber numberWithInt:i]];
            i++;
        }
        [[NSNotificationCenter defaultCenter] removeObserver:self];

        dispatch_async(dispatch_get_main_queue(), ^{

            self.cellInfo.thumbnailsComplete = YES;

            [self setNeedsDisplay];
        });

    });
    dispatch_release(cellSetupQueue);

它在线崩溃:

Media *media = [entry.media objectAtIndex:i];

出现错误:

index 1 beyond bounds [0 .. 0]

上面的NSLog...

NSLog(@"number of thumbnails: %i %i %i", self.cellInfo.numberOfThumbnailsToDraw, entry.media.count, i);

给出结果:

number of thumbnails: 2 1 1

哪种解释了崩溃,除了在 [cellInfoForCellAtIndexPath:] 中设置的值;方法,像这样:

cellInfo.numberOfMediaItems = entry.media.count;
cellInfo.numberOfThumbnailsToDraw = MIN(cellInfo.numberOfMediaItems, 3);

我真的不知道问题出在哪里,或者为什么会发生,但在这部分得到修复之前,我无法继续使用我的应用程序。

4

3 回答 3

2

那么 numberOfThumbnailsToDraw 是 2,这意味着 while 循环会执行 0、1,但是您的 entry.media 的计数只有 1,所以它只有一个 0 索引,所以它当然会崩溃。

于 2012-06-04T15:54:25.087 回答
0

看起来您正在查询 entry.media.count ,其中 entry 是指向一个 MOC 的指针,然后您正在从另一个 MOC 查询它。您要求使用 objectID,这是合理的。

但是,当新 MOC 获取对象时,它不会看到与您在其他 MOC 中看到的相同的值。很可能,这意味着您没有正确保存另一个 MOC。

如果您在新 MOC 上对对象执行 fetch 会发生什么?

另外,我会在命令行选项中启用核心数据调试(-com.apple.CoreData.SQLDebug 1)。这将记录到控制台下面发生的事情。您应该会看到记录到控制台的底层数据库的 SQL 语句。

此外,您正在保存您的 MOC 而不对其进行任何更改,这让我相信您对您的许多 MOC 如何协同工作有点困惑。

于 2012-06-04T20:41:13.710 回答
0
[managedObjectContext obtainPermanentIDsForObjects:self.cellInfo error:nil];
[managedObjectContext save:...];
NSManagedObjectID *entryID = self.cellInfo.objectID;

您需要确保 1. 您有一个永久对象 ID;不是临时的 2. 对象被持久化,以便它出现在新的 MOC 上。

于 2012-06-04T16:13:56.603 回答