2

コールバックでオブジェクト(UserProfileなど)を非同期的に返すメソッドがあります。

このUserProfileオブジェクトに基づいて、一部のコードはaUITableViewCellが編集可能かどうかを計算します。

次のコードを作成しましたが、残念ながら機能しません。

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{        
    Entry *entry = [[self.feed entries] objectAtIndex:[indexPath row]];
    typedef BOOL (^BOOLBlock)(id);

    BOOLBlock bar = ^BOOL (id p) {
        if (p) {
            UserProfile *user = (UserProfile *) p;
            NSEnumerator *e = [[entry authors] objectEnumerator];
            id object;
            while (object = [e nextObject]) {
                if ([[object name] isEqualToString:[[[user authors] objectAtIndex:0] name]])
                    return TRUE;
            }
            return FALSE;
        } 
        else {
            return FALSE;
        }
    };

    [[APPContentManager classInstance] userProfile:bar];    
}

最後の行には、互換性のないブロックポインタタイプの送信が示されています

'__strong BOOLBlock' (aka 'BOOL (^__strong)(__strong id)') to parameter of type 'void (^)(UserProfile *__strong)'

APPContentManager.h

-(void)userProfile:(void (^)(UserProfile *user))callback;
4

1 に答える 1

3

この-userProfile:メソッドはBOOLBlockタイプを予期していません。これは、何も返す責任がありません。ここではセマフォを使用しますが、予想される同期性に関するTillのコメントを覚えておく必要があり-tableView:canEditRowAtIndexPath:ます。userProfile:メソッドに時間がかかる場合は、この編集可能性情報を確実に事前に取得する必要があります。

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {        
    Entry *entry = [[self.feed entries] objectAtIndex:[indexPath row]];
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    __block BOOL foundAuthor = NO;

    [[APPContentManager classInstance] userProfile:^(UserProfile *user) {
        NSEnumerator *e = [[entry authors] objectEnumerator];
        id object;
        while (object = [e nextObject]) {
            if ([[object name] isEqualToString:[[[user authors] objectAtIndex:0] name]]) {
                foundAuthor = YES;
                break;
            }
        }
        dispatch_semaphore_signal(sema);
    }];
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    dispatch_release(sema);

    return foundAuthor;
}
于 2012-12-25T17:53:48.487 に答える