• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 在私有(private)队列上运行任务并返回回调

[复制链接]
菜鸟教程小白 发表于 2022-12-13 14:04:48 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我的方法在私有(private)队列中运行其代码,完成后将调用传入的回调。是否需要检查传入的回调是否打算从主队列运行?

例如

- (void)doSomethingWithCalbackvoid(^)())callback {
    dispatch_async(self.privateQueue, ^{
    // Should I make sure this gets dispatched 
    // to a main thread if it was passed in from a main thread?
        if (callback) callback();
    });
}

我应该执行以下操作吗:

    - (void)doSomethingWithCalbackvoid(^)())callback {
        BOOL isMainThread = [NSThread isMainThread];
        dispatch_async(self.privateQueue, ^{
            if (callback) {
               if (isMainThread) {
                 dispatch_async(dispatch_get_main_thread, callback); 
               }
               else {
                 callback();
               }
            }
        });
    }



Best Answer-推荐答案


虽然这在任何地方都没有规定,但如果您查看 Cocoa API,您会看到三种常见模式:

  1. 主线程: 明确指定将使用主队列的完成处理程序。例如,引用 CLGeocoder asynchronous query methods ,其中“您的完成处理程序 block 将在主线程上执行。”

  2. 任意队列:完成处理程序,您无法保证代码将在哪个队列运行。例如,如果您使用 CNContactStorerequestAccessForEntityTypethe documentation says “在任意队列上调用完成处理程序。”

  3. 指定队列:完成处理程序,您可以在其中指定要使用的队列。例如,如果您使用 [NSURLSession sessionWithConfiguration:delegate:queue:],您可以指定哪个队列将用于委托(delegate)方法和回调 block /闭包。 (但是,顺便说一句,如果您不指定队列,它会使用自己的设计,而不是默认为主队列。)

但是,您提出的模式不遵循任何这些非正式约定,而是有时使用主线程(如果您碰巧从主线程调用它),但有时使用一些任意队列。在这种情况下,我认为没有必要引入新的约定。

我建议选择上述方法之一,然后在已发布的 API 中明确说明。例如,如果您要使用 privateQueue:

@interface MyAPI : NSObject

/// Private queue for callback methods

@property (nonatomic, strong, readonly) dispatch_queue_t privateQueue;

/// Do something asynchronously
///
/// @param callback  The block that will be called asynchronously.
///                  This will be called on the privateQueue.

- (void)doSomethingWithCallbackvoid(^)())callback;

@end

@implementation MyAPI

- (void)doSomethingWithCallbackvoid(^)())callback {
    dispatch_async(self.privateQueue, ^{
        if (callback) callback();
    });
}

@end

或者

@interface MyAPI : NSObject

/// Private queue used internally for background processing

@property (nonatomic, strong, readonly) dispatch_queue_t privateQueue;

/// Do something asynchronously
///
/// @param callback  The block that will be called asynchronously.
///                  This will be called on the main thread.

- (void)doSomethingWithCallbackvoid(^)())callback;

@end

@implementation MyAPI

- (void)doSomethingWithCallbackvoid(^)())callback {
    dispatch_async(self.privateQueue, ^{
        if (callback) { 
            dispatch_async(dispatch_get_main_queue(), ^{
                callback();
            });
        }
    });
}

@end

注意,无论您使用哪种约定,我都建议您在标题中使用 /// 注释或 /** ... */ 注释,这样当您使用代码中的方法,您可以看到右侧快速帮助面板中显示的队列行为。

关于ios - 在私有(private)队列上运行任务并返回回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35256182/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap