1

什么是编写多线程应用程序的首选方式。我看到了两种方式。在内部使用 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 代码)。

于 2013-08-04T07:51:42.327 回答