0

所以我有一个UIViewController使用NSOperationQueue. 起初我在使用种子数据时有注释掉的行,但现在我已经切换到使用实际服务。数据适当地到达此方法,但 UI 没有更新。然后我读到您需要在主线程上运行 UI 更新,所以我将其更改为以下代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.menuView = (MenuView*)self.view;
    [MenuUIModel loadAndOnSuccess:^(id data, id context) {
        [self.menuView performSelectorOnMainThread:@selector(bindToModel:) withObject:data waitUntilDone:YES];
        //[self.menuView bindToModel:(MenuUIModel*)data];
    } onFail:^(NSString *error, id context) {
        NSLog(@"FAIL with error: %@", error);
    }];
}

这是MenuView,虽然略有修剪。

@interface MenuView : UITableView

@property (strong, nonatomic) NSArray *menuItemViews;

// Menu Item View Loading Outlet
@property (strong, nonatomic) IBOutlet MenuItemView *lastLoadedMenuItemView;

- (void) bindToModel:(MenuUIModel*)model;

@end

@implementation MenuView

- (void)bindToModel:(MenuUIModel*)model
{
    if (model) {
        NSMutableArray *mutableMenuItemViews = [NSMutableArray array];
        UINib* inMemoryNib = [UINib nibWithNibName:@"MenuItemView" bundle:nil];
        for (MenuItemUIModel *item in model.Items) {
            [inMemoryNib instantiateWithOwner:self options:nil];
            [self.lastLoadedMenuItemView bindToModel:item];
            [mutableMenuItemViews addObject:self.lastLoadedMenuItemView];
            index++;
        }
        self.menuItemViews = [[NSArray alloc] initWithArray:mutableMenuItemViews];
    }
}

@end

我意识到这种加载笔尖的方法有点不同,但目的是我只将笔尖及其资源加载到内存中一次,但在必要时实例化它。它还可以与种子代码完美配合。

所以我认为在主线程上运行这个方法会起作用,但显然不是。另一个注意事项,我添加了一个测试UILabelMenuView当我用这种方法测试它时它会完美更新。因此,当我在我的内部调用 bindToModel 时,MenuView它不再在主线程上运行吗?

4

1 回答 1

1

编辑:我的第一反应将 Cocoa 桌面绑定机制与您在此处称为绑定的方法混淆了。Cocoa 绑定在 iOS 上的 Cocoa Touch 中根本没有实现,所以我之前的建议是无关紧要的。对于那个很抱歉!

要回答您的问题,从您显示的代码来看,是的,您-bindToModel:方法中的所有内容都在主线程上运行。此处可见您的线程模型没有明显问题。

我建议NSLog()在您的方法中添加一些调用,-bindToModel:以确保一切按您的预期工作。控制台日志的输出将包含一个线程 ID,因此您可以确定事情正在您想要的线程上发生。

于 2012-07-26T16:47:26.117 回答