热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

试图理解异步操作子类

如何解决《试图理解异步操作子类》经验,为你挑选了1个好方法。



1> Rob..:

你说:

    stateQueue物业的目的是什么?我看到它被get和set的state计算属性使用,但我找不到任何解释它们sync:flags:executesync:execute它们使用的方法的文档.

此代码"同步"对属性的访问以使其线程安全.至于为什么你需要做的是,看到的Operation文件,其中建议:

多核注意事项

...当您进行子类化时NSOperation,必须确保从多个线程调用任何重写的方法都是安全的.如果在子类中实现自定义方法(如自定义数据访问器),则还必须确保这些方法是线程安全的.因此,必须同步对操作中的任何数据变量的访问,以防止潜在的数据损坏.有关同步的更多信息,请参阅" 线程编程指南".

关于这个并发队列用于同步的确切用法,这被称为"读写器"模式.读写器模式的这个基本概念是读取可以相互发生并发生(因此sync,没有障碍),但是对于该属性的任何其他访问(因此async具有障碍),写入决不能同时执行.这些都在WWDC 2012视频异步设计模式与块,GCD和XPC中描述.请注意,而视频概述基本的概念,它使用旧的OperationNSObject语法,而不是仅仅的斯威夫特3及更高版本的语法["state"]NSObject这里使用的语法.

你还问:

    class func keyPathsForValuesAffectingValue(forKey key: String) -> Set返回部分中三个类方法的目的是什么state?我没有看到它们被用在任何地方.我找到了isReady,isExecuting但是,这似乎没有帮助我理解为什么声明这些方法.

这些只是确保对isFinished属性的更改触发属性的KVN的方法keyPathsForValuesAffectingValue,AsynchronousOperation以及super.start().这三个密钥的KVN对于异步操作的正确运行至关重要.无论如何,在键值观察编程指南:注册从属密钥中概述了这种语法.

start您找到的方法是相关的.您可以使用该方法注册相关密钥,也可以使用原始代码段中显示的各个方法.


顺便说一句,这是super您提供的课程的修订版,即:

    你不能打电话@objc.正如execute文档所述(强调添加):

    如果要实现并发操作,则必须覆盖此方法并使用它来启动操作.您的自定义实现不得main随时调用.

    Operation在Swift 4中添加所需.

    重命名isReady为use final,这是isReady子类的约定.

    宣布#keyPathdynamic财产是不恰当的.任何子类都应该有权进一步完善其willChangeValue逻辑(尽管我们很少这样做).

    使用didChangeValue使代码更安全/健壮.

    使用finish属性时,您不需要手动KVN .本例中手动调用.finishedstateQueue不需要.

    改变,state以便它只移动到sync:flags:execute状态if sync:execute.

从而:

class ThreadSafeArray {
    private var values: [T]
    private let queue = DispatchQueue(label: "...", attributes: .concurrent)

    init(_ values: [T]) {
        self.values = values
    }

    func reader(block: () throws -> U) rethrows -> U {
        return try queue.sync {
            try block()
        }
    }

    func writer(block: @escaping (inout [T]) -> Void) {
        queue.async(flags: .barrier) {
            block(&self.values)
        }
    }

    // e.g. you might use `reader` and `writer` like the following:

    subscript(_ index: Int) -> T {
        get { reader { values[index] } }
        set { writer { $0[index] = newValue } }
    }

    func append(_ value: T) {
        writer { $0.append(value) }
    }

    func remove(at index: Int) {
        writer { $0.remove(at: index)}
    }
}


我不同意.[并发编程指南](https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW16)鼓励使用`start`和`main`进行异步操作.在讨论`main`和异步操作时,他们说,"虽然你可以在`start`方法中执行任务,但使用[`main`]实现任务可以使你的设置和任务代码更清晰地分离. ".
推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 感谢大家对IT十八掌大数据的支持,今天的作业如下:1.实践PreparedStament的CRUD操作。2.对比Statement和PreparedStatement的大批量操作耗时?(1 ... [详细]
  • 属性字符串NSMutableAttributedString
    要实现如下效果:NSString*mailStringmymail126.com;NSString*mailStringWithQuotes[NSStringst ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
author-avatar
HS_G_960
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有