所以我有一个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
我意识到这种加载笔尖的方法有点不同,但目的是我只将笔尖及其资源加载到内存中一次,但在必要时实例化它。它还可以与种子代码完美配合。
所以我认为在主线程上运行这个方法会起作用,但显然不是。另一个注意事项,我添加了一个测试UILabel
,MenuView
当我用这种方法测试它时它会完美更新。因此,当我在我的内部调用 bindToModel 时,MenuView
它不再在主线程上运行吗?