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 回答