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 が 1 つの MOC へのポインターである entry.media.count を照会しているように見えます。次に、別の MOC から照会しています。objectID を使用して質問していますが、これは合理的です。

ただし、新しい MOC がオブジェクトを取得すると、他の MOC で見たのと同じ値が表示されません。ほとんどの場合、これは他の MOC を適切に保存していないことを意味します。

新しい MOC でオブジェクトのフェッチを実行するとどうなりますか?

また、コマンド ライン オプションでコア データのデバッグ (-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 に答える