0

完了するまでに時間がかかる可能性のあるIO操作を実行する必要があります。IOの生成は、ボタンから呼び出されます。もちろん、操作が完了するまでUIはハングします。したがって、バックグラウンドスレッドでIOを実行する必要があると思いますが、操作が完了したら、ウィンドウのラベルを更新して、操作が完了したことを通知する必要があります。メインスレッド(JavaのEDTやC#の同様のものなど)で実行する必要があると思いますが、正しいですか?

C#には、JavaandroidにTaskAsyncなどのクラスがあります。これにより、別のスレッドで長いタスクを完了できます。タスクが完了すると、メインスレッドでハンドラーが呼び出されるため、メインスレッドでUIを更新できます。

cocoaは正確に同様のタスクを実行する必要があります。つまり、メインスレッドとは別のスレッドで長い操作を許可し、メインスレッドのユーザーインターフェイスの更新を何らかの方法で容易にします。

4

2 に答える 2

1

長時間実行する操作は、NSOperationサブクラスに移動する必要があります

AhmedsOperation.h

@interface AhmedsOperation : NSOperation

@end

AhmedsOperation.m

@implementation AhmedsOperation

// You override - (void)main to do your work
- (void)main
{
    for (int i = 0; i < 1000; i++) {
        if ([self isCancelled]) {
            // Something cancelled the operation
            return;
        }

        sleep(5);

        // Emit a notification on the main thread
        // Without this, the notification will be sent on the secondary thread that we're
        // running this operation on
        [self performSelectorOnMainThread:@(sendNotificationOnMainThread:)
                               withObject:[NSNotification notificationWithName:@"MyNotification"
                                                                        object:self
                                                                      userInfo:nil]
                            waitUntilDone:NO];
    }
}

- (void)sendNotificationOnMainThread:(NSNotification *)note
{
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc postNotification:note];
}

次に、メインコードで、操作を実行する場合は、AhmedsOperationオブジェクトを作成し、それをNSOperationQueueにプッシュして、通知をリッスンします。

AhmedsOperation *op = [[AhmedsOperation alloc] init];
NSOperationQueue *defaultQueue = [MLNSample defaultOperationQueue];

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
       selector:@selector(progressUpdateNotification:)
           name:@"MyNotification"
         object:op];

[defaultQueue addOperation:op]; 
于 2013-02-12T07:01:14.140 に答える
0

UIを更新するViewControllerへのハンドルがあるとすると、NSObject" performSelectorOnMainThread:withObject:waitUntilDone:"メソッドを使用できます。

2)次のようなコードでGrandCentralDispatchを利用することもできます。

dispatch_async(dispatch_get_main_queue(), ^{
    [viewController doSomethingWhenBigOperationIsDone];
}); 

3)または、(メインスレッドの)オブザーバーがUIを更新できるバックグラウンドスレッドからNSNotificationを投稿することもできます。

この関連する質問で、いくつかの追加の有用な情報を見つけることができます

于 2013-02-10T02:12:34.603 に答える