0

これが私がやっていることです。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{
    NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://myurl"]]];
    dispatch_sync(dispatch_get_main_queue(), ^{
        if(!data) {
            // data not recieved or bad data. Initiate reachability test
            // I have built a wrapper for Reachability class called ReachabilityController
            // ReachabilityController also notifies the user for avaibility, UI 

            ReachabilityController *reachability = [[ReachabilityController alloc] init];
            [reachability checkReachability];
            return;
        }
        //update table
    });
});

私の問題は、到達可能性テストがメイン キューで実行されていることです。これにより、UI がフリーズすることがよくあります。バックグラウンドモードで実行したい。

バックグラウンド モードまたは優先度の低いモードで ReachabilityTest を処理したいと考えています。しかし、繰り返しになりますが、到達可能性コントローラーは現在のネット可用性をユーザーに通知するため、ある時点でメイン キューを再度使用する必要があります。

もっと良い方法があるはずだと強く信じています。

4

1 に答える 1

1

ただし、これは正しい方法です。完全にきれいに見えるわけではありませんが、それは間違っているという意味ではありません。コードを「よりクリーン」に見せたい場合は、コードを調べてNSThread作業を進めたいと思うかもしれませんが、これははるかに簡単なアプローチです。

私のプロジェクトで見やすくするために、ブロックを使用するディスパッチャーという単純なクラスを作成しました。

+ (void)dispatchOnBackgroundAsync:(void(^)(void))block {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), block);
}

+ (void)dispatchOnMainAsync:(void(^)(void))block {
    dispatch_async(dispatch_get_main_queue(), block);
}

次のように使用します。

[Dispatcher dispatchOnBackgroundAsync:^{
    // background thread code

    [Dispatcher dispatchOnMainAsync:^{
        // main thread code
    }];
}];
于 2013-01-15T12:10:42.623 に答える