Ios 需要特定线程的可靠方法

Ios 需要特定线程的可靠方法,ios,objective-c,xcode,multithreading,grand-central-dispatch,Ios,Objective C,Xcode,Multithreading,Grand Central Dispatch,给定必须在主线程上执行的方法: -(void)methodRequiringMainThread{ int a=1; } 以及它的调用方: -(void)callerToMethod{ if(![NSThread isMainThread]){ dispatch_sync(dispatch_get_main_queue(), ^{[self methodRequiringMainThread]}); } else

给定必须在主线程上执行的方法:

    -(void)methodRequiringMainThread{

     int a=1;

    }
以及它的调用方:

    -(void)callerToMethod{

      if(![NSThread isMainThread]){
        dispatch_sync(dispatch_get_main_queue(), ^{[self methodRequiringMainThread]}); 
      } else {
       [self methodRequiringMainThread];
      }

}
确保在主线程上调用该方法的最佳实践是什么

  • 在接口注释中添加注释,并希望所有调用者检查main 根据需要执行线程和调度(如上所述)
  • 将私有方法包装在 公共方法,它只检查主线程并分派 根据需要使用私有方法
  • 在被调用的方法中插入NSAssert
  • 我看到过依赖于#1+#3的问题,我不喜欢它,因为你不能测试一个调用程序,它很少会在另一个线程上结束

    我也不喜欢它,因为在方法签名(它是一个重要的半秘密)中没有向调用方透露此需求的特定功能

    我更喜欢使用#2(或者只是在内部将内容包装在一个块中并进行检查),因为它保证了主线程,而不管调用方是谁


    UIKit似乎也没有做任何明确的检查或曝光,这在这一点上很奇怪。似乎应该有某种内置的功能,即使它只是XCode的内部功能,用于通信和/或保证线程。

    如果有一种方法应该始终在主线程上运行,为什么不把它的所有实现放在dispatch_get_mainqueue块中呢?另一种选择是将函数代码作为方法本身的一个块,然后使用策略2中的逻辑来执行该块或将其分派到正确的线程。次要优势:用一种方法而不是两种方法来达到目的。我认为这是@Alexkosiakov的观点,但要重申:选项2很好,但不需要额外的方法。让
    methodRequiringMainThread
    的第一行执行分派。是的!这实际上是我的第一个响应,但将方法的全部内容包装在块中有点难看。另外,由于它是一个同步,我必须首先进行检查,所以实际上我必须首先分配一个块变量,然后在最后有条件地分派,这有点奇怪。我也不完全确定对参数和返回值的影响,特别是,例如,是否需要削弱已传递的自我(示例中未说明),因此关于此方法的另一个问题是。。。如果UIKit方法必须在主线程上运行,为什么UIKit不这样做?为什么UIKit允许调用方出错?如果有一个方法应该总是在主线程上运行,为什么不把它的所有实现放在dispatch_get_mainqueue块中呢?另一种选择是将函数代码作为方法本身的一个块,然后使用策略2中的逻辑来执行该块或将其分派到正确的线程。次要优势:用一种方法而不是两种方法来达到目的。我认为这是@Alexkosiakov的观点,但要重申:选项2很好,但不需要额外的方法。让
    methodRequiringMainThread
    的第一行执行分派。是的!这实际上是我的第一个响应,但将方法的全部内容包装在块中有点难看。另外,由于它是一个同步,我必须首先进行检查,所以实际上我必须首先分配一个块变量,然后在最后有条件地分派,这有点奇怪。我也不完全确定对参数和返回值的影响,特别是,例如,是否需要削弱已传递的自我(示例中未说明),因此关于此方法的另一个问题是。。。如果UIKit方法必须在主线程上运行,为什么UIKit不这样做?为什么UIKit允许调用者出错?