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

このペン先をロードする方法は少し異なりますが、目的は、ペン先とそのリソースをメモリに1回だけロードし、必要に応じてインスタンス化することです。また、シードコードでもうまく機能します。

したがって、メインスレッドでこのメソッドを実行すると機能すると思いましたが、明らかに機能しません。別の注意点として、にテストを追加しましたが、このメソッドでテストUILabelするMenuViewと完全に更新されました。では、内部でbindToModelを呼び出すとMenuView、メインスレッドなどで実行されなくなりますか?

4

1 に答える 1

1

編集:私の最初の応答は、Cocoaデスクトップバインディングメカニズムを、ここでバインディングと呼んでいるメソッドと混同していました。CocoaバインディングはiOSのCocoaTouchにはまったく実装されていないため、以前のアドバイスは関係ありませんでした。申し訳ありません!

あなたの質問に答えるために、あなたが示したコードから、はい、あなたの-bindToModel:メソッドのすべてがメインスレッドで実行されています。ここに表示されているスレッドモデルに明らかな問題はありません。

NSLog()メソッド内にいくつかの呼び出しを追加して-bindToModel:、すべてが期待どおりに機能していることを確認することをお勧めします。コンソールログへの出力にはスレッドIDが含まれるため、意図したスレッドで何かが起こっていることを確実に知ることができます。

于 2012-07-26T16:47:26.117 に答える