14

私は .NET と Java のバックグラウンドから来て、Objective C を初めて使用します。

だから私はいくつかのUIwebviewsを非同期的に作成する必要があります.私は自分のキューでこれを行っています

     dispatch_queue_t queue = dispatch_queue_create("myqueue", NULL);
     dispatch_async(queue, ^{
        // create UIwebview, other things too
             [self.view addSubview:webView];
        });

ご想像のとおり、これはエラーをスローします:

   bool _WebTryThreadLock(bool), 0xa1b8d70: Tried to obtain the web lock from a thread other  
   than the main thread or the web thread. This may be a result of calling to UIKit from a  
   secondary thread. Crashing now...

では、メインスレッドにサブビューを追加するにはどうすればよいですか?

4

3 に答える 3

17

すでにディスパッチ キューを使用しているため。私は使用しませんperformSelectorOnMainThread:withObject:waitUntilDone:が、メイン キューでサブビューの追加を実行します。

dispatch_queue_t queue = dispatch_queue_create("myqueue", NULL);
dispatch_async(queue, ^{
    // create UIwebview, other things too

    // Perform on main thread/queue
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.view addSubview:webView];
    });
});

UIWebViewをバックグラウンド キューでインスタンス化しても問題ありません。ただし、サブビューとして追加するには、メインスレッド/キューにいる必要があります。UIViewドキュメントから:

スレッドに関する考慮事項

アプリケーションのユーザー インターフェイスの操作は、メイン スレッドで行う必要があります。したがって、常にアプリケーションのメイン スレッドで実行されているコードから UIView クラスのメソッドを呼び出す必要があります。これが厳密に必要でない唯一の場合は、ビュー オブジェクト自体を作成するときですが、他のすべての操作はメイン スレッドで実行する必要があります。

于 2013-02-24T07:52:08.363 に答える
2

のインスタンスを含むほとんどの UIKit オブジェクトは、メイン スレッド/キューからのみUIView操作する必要があります。他のスレッドまたはキューにメッセージを送信することはできません。これは、他のスレッドまたはキューでそれらを作成できないことも意味します。UIView

于 2013-02-24T06:21:13.427 に答える
1

ロブが言ったように、UI の変更はメイン スレッドでのみ行う必要があります。セカンダリ スレッドから追加しようとしています。コード[self.view addSubview:webView];を次のように変更します。

[self.view performSelectorOnMainThread:@selector(addSubview:) withObject:webView waitUntilDone:YES];

于 2013-02-24T07:24:36.213 に答える