1

マルチスレッドアプリを作成するためのより好ましい方法は何ですか。私には2つの方法があります。内部で GCD を使用してメソッドを実装してから単純に呼び出す (myMethodA) か、メソッドを実装してから GCD で呼び出すだけですか? 前もって感謝します。

私のポイント:

ClassA / method implementation

- (void)myMethodA
{
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //  doSomething1
    //  doSomething2
  });
}

- (void)myMethodB
{
  //  doSomething1
  //  doSomething2

}

ClassB / method call
{
  [myClassA methodA];
  // or
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
     [myClassA methodB];
  };
}
4

3 に答える 3

4

私見、どちらも。

推奨される方法は、アクションを実行する場所を知っているオブジェクトを持つことです。

completion_block_t completionHandler = ^(id result) { ... };
AsyncOperation* op = [AsyncOperation alloc] initWithCompletion:completionHandler];
[op start];  // executes its actions on a private execution context

次に、これらの AsyncOperation オブジェクトを便利なメソッドにラップできます。

- (void) fetchUsersWithCompletion:(completion_block_t)completionHandler  
{
    NSDictionary* params = ...;
    self.currentOperation = [[HTTPOperation alloc] initWithParams:params
                                                      completion:completionHandler];
    [self.currentOperation start];
}

クライアントは、その completionHandler を実行する場所を指定することのみに関心がある場合があります。API は次のように拡張できます。

- (void) fetchUsersWithQueue:(NSOperationQueue*)handlerQueue 
              withCompletion:(completion_block_t)completionHandler 
{
    NSDictionary* params = ...;

    self.currentOperation = [[HTTPOperation alloc] initWithParams:params
                                                      completion:^(id result){
        // As per the documentation of HTTPOperation, the handler will be executed
        // on an _unspecified_ execution context.
        // Ensure to execute the client's handler on the specified operation queue:
        [handlerQueue:addOperationWithBlock:^{
            completionHandler(result);
        }];
    }];
    [self.currentOperation start];
}

後者の API は次のように使用できます。

[self fetchUsersWithQueue:[NSOperation mainQueue] completion:^(id result){
    self.users = result;
    [self.tableView reloadData];
}];
于 2013-08-04T11:34:59.380 に答える
0

個人の好み。コードをより読みやすく/理解しやすく/明白にするものを選択してください。また、コードを「現在の」スレッドで実行できるようにするか、それとも常にバックグラウンド スレッドで実行する必要があるかを検討してください。スレッド構成を設計し、それを記述してから、それを念頭に置いて実装する必要があります。あなたの例のようにクラス間でメソッドを呼び出している場合、通常、呼び出し元のクラス内ではなく、そのクラス内でスレッドを処理する必要があると言えます。しかし、それは知識の分配に関するものです。

于 2013-08-04T07:51:27.717 に答える
0

それは大した違いはありません - それはあなたが何をしたいかによるだけです。毎回異なるキューでメソッドを実行する場合は、myMethodBシステムの方が適しています。ただし、常に同じキューでメソッドを実行する場合は、myMethodAコードを記述する時間を節約できます (GCD コードを 1 回記述するだけで済みます)。

于 2013-08-04T07:51:42.327 に答える