NSNotificationCenter和委派是每种允许您在iOS项目的各个类中交流信息的方法。 但是这些概念之间有什么区别? 您什么时候可以使用另一个? 有没有要考虑的缺点? 让我们潜入。 什么是授权? 委托是一种设计模式,顾名思义,它出于沟通目的将一类的责任和控制权委托给另一类。 基本上,一个类(委托人)陈述了另一类(或委托人)必须遵守的某些行为。 因此,委托人可以指望每次使用委托人时都会执行的行为。 此外,委托可以返回信息。 委派的一个示例是内置的UITableViewDelegate,它具有许多(可选)方法。 如Apple所述,例如func tableView(UITableView, didSelectRowAt: IndexPath)是一种告诉UITableViewDelegate现在已选择指定行的方法。 换句话说,表视图将执行此操作的委托委托给它的委托,该委托返回有关选择了哪一行的信息。 可以将委托通信与电话进行比较:只有委托人和委托人正在互相交谈。 在审查NSNotificationCenter时请记住这一点! 什么是NSNotificationCenter? 苹果将NSNotificationCenter描述为“一种在程序中传播信息的机制。” NSNotificationCenter发送通知,观察者被设置为“监听”该通知,然后采取自己的指定动作。 NSNotificationCenter提供了一种将事件通知多个对象的方法。 (请注意,一旦观察者不再需要侦听通知,则也需要将其删除。) 与委托电话的类比不同,NSNotificationCenter更像是无线电广播:多个接收者可以收听和收听消息,但不能将信息中继回发送者。 行动! 所有通过NSNotificationCenter或委托进行的通信都用于创建操作。 使用NSNotificationCenter,设置为侦听/观察的任何实例都将在“听到”通知后立即执行自己的操作。 对于委派,代表必须采取委派者提出的具体行动,只要考虑到所有这些行动,就可以按照需要的顺序调用这些行动。 想象一下NSNotificationCenter的竞赛。 跑步者(观察者)正在收听起跑喇叭(通知)。 一听到他们的声音,每个跑步者便开始自己的动作:奔跑,跳跃,走路,停下来系鞋带等。起跑号角并不能控制跑步者在做什么,但确实会导致他们开始! 同时,想象一下种族作为代表的清理工作人员。 赛事组织者(代表)已汇总了赛事结束后需要清洁的所有区域的清单:垃圾桶,街道,看台等。清洁人员(代表)必须完成组织者已安排的任务,但是他们的任务可以按照当时最有意义的顺序进行:说他们只有在清理看台后才能进入街道,因此他们要先看台。 清理人员还可以将有关清理工作发生情况的信息返回给比赛组织者。 尽管组织者和清理人员只是互相交流,但组织者绝对可以依靠清理人员来完成工作! 外卖 这就是说NSNotificationCenter和委托用于非常不同的情况:NSNotification用于在类之间发送一对多消息,而委托用于发送一对一消息。 设置代表正在创建一个耦合关系,其中两个对象彼此直接通信。 同时,NSNotificationCenter是一个更加分离的关系。 在使用方面,如果需要将单个事件通知多个对象,则NSNotificationCenter可以完成此工作。 如果需要执行特定操作,或者接收方需要将信息返回给发送方,则委派是一个不错的选择。 更多的听众,更多的问题…… 另一个使用注意事项可能是调试。 在研究此主题时经常出现的问题是调试NSNotificationCenter问题的难度,因为观察者/侦听器的数量越多,越难分辨是什么引起了问题并追踪问题。 正如许多消息来源很快指出的那样,对于开始使用NSNotificationCenter调试与应用程序流和控制相关的问题的现有项目的开发人员而言,这尤其困难。 资源资源 https://developer.apple.com/reference/foundation/nsnotificationcenter https://www.raywenderlich.com/90773/introducing-ios-design-patterns-in-swift-part-2 http://useyourloaf.com/blog/delegation-or-notification/ https://www.andrewcbancroft.com/2015/02/05/nsnotificationcenter-vs-delegation-analysis/ http://www.andrewcbancroft.com/2015/03/26/what-is-delegation-a-swift-developers-guide/ http://www.andrewcbancroft.com/2014/10/08/fundamentals-of-nsnotificationcenter-in-swift/
莫雅是什么? 为什么呢? Moya是我们想要一些网络抽象层来充分封装实际直接调用Alamofire的层。 它应该足够简单,以使常见的事情变得容易,但是应该足够全面,以使复杂的事情也变得容易。 Moya的出色功能: 编译时检查API端点访问是否正确。 使您可以定义具有关联的枚举值的不同端点的明确用法。 将测试存根视为一流公民,因此单元测试非常容易。 安装 安装部分在Moya的Github页面上描述得非常好。 API 我们将使用JSONPlaceholder作为我们的API。 让我们从模型开始 对于输出模型,我们将使用typealias Codable = Encodable&Decodable 。 使用TargetType创建API枚举 为了使发布尽可能容易,我们将只使用1个POST和2个GET路由。 让我们创建API枚举: 并在其之上添加Moya的必要扩展: 首先, baseURL 。 这用于我们的API的基本URL: 接下来, path 。 我们使用它来定义不同的路由(例如/ posts , / comments等): 接下来, 方法 。 我们可以为不同的func定义不同的方法: 接下来,我们需要样本数据进行测试。 我们不会在那个帖子上介绍这个。 因此,让我们给它一个简单的Data() : 接下来,我们需要定义任务 。 我们需要.requestPlain来获取所有Post 。 .requestParameters用于获取特定的Post 。 最后, .requestJSONEncodable用于使用我们的Codable对象创建一个Post 。 最后,我们需要headers 。 这将与我们的所有请求一起发送: 创建我们的网络代表 […]
我已经在Lambda School的第二周完成了第一天的学习,这是一个为期30周的沉浸式在线课程,旨在教学生成为成熟的软件工程师。 我的专长是iOS开发。 还有许多其他与技术相关的轨道。 我们的演讲围绕协议和委托模式。 委托模式是成为合格的开发人员的iOS基础的重要组成部分。 在现实生活中委派相对简单:A人告诉B人做某事; 人B完成任务(而人A因完成任务而获得荣誉-#bosslife)。 在编程中,委托的核心概念是在两个不同的视图控制器之间传递信息。 这是一个类似的概念,但是要实现这一目标还需要更多步骤。 我理解为什么他们会在头几周内教它,因为委派在编程中是如此重要。 而且,类似于生活,我们需要练习。 现在学习它将使我们又有28周的时间来实践此概念。 说实话,委托人和委托人的概念对我和班上的大多数学生来说都很难理解。 即使经过两个小时的演讲,我仍然花了整夜的时间来完成日常作业项目,该项目要求我们在项目中使用委托模式。 参加Lambda学校的好处是,它为可能为概念苦苦挣扎超过一天的学生提供了一个选择。 Lambda提供了一种称为异步调度的方法,这基本上意味着,如果您在课程的特定星期后没有一定程度的信心,则可以重复这一周。 革命性的? 真是的 许多其他的iOS训练营都无法提供此选项。 他们的课程可能必须遵循更严格的时间表,以容纳将来的同类研究小组。 我觉得通过提供异步计划,Lambda学校确实体现了他们投资于学生的使命。 免责声明:我绝不会为此插件获得回扣; 我只是希望这些信息能对Lambda学校的篱笆上的所有人有所帮助。 如果您像我一样(需要大量了解和重复使用iOS概念的人),则应该诚实地考虑一下。 随着时间的推移,我将在Lambda上发布更多关于我的经历的博客,因此,如果您对这样的训练营内的生活感兴趣,请在此处或在Twitter上关注我。
尝试改善Swift和iOS生态系统中的委派模式。 委派是大多数iOS SDK所基于的核心模式之一。 首先是UIKit。 熟悉它们是开发适当的iOS应用程序的核心。 委托正在解决软件开发中最困难的问题之一:对象之间的通信和信息共享。 不同的解决方案是一个复杂的问题。 我已经尝试了尝试解决此问题的不同解决方案,但我仍然认为简单授权是要走的路。 它既简单又健壮。 是的,它不像反应式编程那样流行,但可以。 委派的问题在于它不是即时的。 需要一点时间来了解。 而且当您熟悉它时,它仍然涉及为您需要的每个上下文编写一个新的委托协议。 使用代表的原因主要有两个: 可以在使用时自定义的通用对象。 考虑一下UICollectionView。 它依赖于DataSource委托方法来获取必须显示的信息。 必须与另一个对象通信的对象。 考虑一下以模态形式呈现ChildVC的ParentVC。 在ChildVC完成目标之后,它必须与ParentVC交流,他希望被解雇。
最近,我被要求从我们的一个应用程序中删除一个较旧的框架,并用更新的(兼容iPhone X的)替代品替换它。 当我开始创建替代产品时,我们公司将计划转移到其他方面,但是我不想失去项目最后几周的工作/更新,以使所有工作顺利进行。 这就是为什么我将向您展示我本周工作的绝妙内容! (已完成的Repo Link在底部!) 好的,所以首先创建一个单视图应用程序(对于我的演示,我将其命名为新的标签栏)。 您要在主视图控制器中添加一个collectionview和一个Container View。 我将容器视图设置为将尾随,前导和顶部与安全区域对齐,并将展位空间与集合视图对齐。 我的收藏夹视图约束设置为:高度60,将尾随,前导和底部对齐到安全区域,顶部空间对齐到容器视图。 继续并删除设置Container View Controller时获得的defualt view controller。 在您的collectionView单元格中添加一个imageView和一个标签。 将图像视图的约束设置为:到单元格的尾随空间和前导空间10(消除了一个名为tabCell的类),顶部空间等于单元格,底部空间至标签。 将标签约束设置为:尾随前导底部到单元格,高度为15,顶部到imageView。 然后选择您的collectionView并将“滚动方向”设置为“水平”。 并且您的单元格大小为60X60。 将重用标识符设置为“ tabCell” 然后将您的Outlets设置到ViewController(我的名为MainViewController),并在viewDidLoad中设置您的collectionView委托和dataSource。 创建对MainViewController的扩展,以熟悉协议。 现在在DataSource中,只需为numberOfItemsInSection返回1并在cellForItemAtIndex中返回UICollectionViewCell()。 创建一个名为TabCollectionViewCell的新类,并通过联播为您的标签单元分配该类。 为imageView和Label设置插座。 完成后,它应该看起来像这样(请注意,我的标签渲染图未显示,因此我将其突出显示。): 现在我们都准备开始编程了!! 我个人想先解决最小的问题,所以我将设置TabCollectionViewCell。 覆盖您的awakeFromNib并准备调用名为updateWithImage的函数的prepareForReuse。 您的updateWithImage应该包含一个可选图像,并将该图像设置为tabImageView.image属性。 如果没有传递任何内容,则将其设置为nil。 由于我们正在使用自定义选项卡,因此我创建了一个选项卡模型(因为我很有创造力,因此命名为选项卡!)我将类Tab设置为具有tabName:String和tabImageName:String,并设置init来保存这些新值。 是时候进入我们的MainViewController了。 设置一个私有Tab变量,并使其成为Tab列表,一个私有selectedIndex来保存我们的索引选择。 并在didLoad视图中将selectedIndex设置为0。同样在viewDidLoad中,在设置collectionViewDelegate和Datasource之前,向选项卡列表调用一个新函数addingTabs。 在您的addTabs函数中设置您的主选项卡,然后设置一些选项卡(请注意,在我的项目中,我将其主题设置为超级护林员,并添加了一些经典以及较新的超级护林之一。 将您的numberOfItemsInSection更新为tabs.count,并更新cellForItemAt indexPath以返回tabCell(确保将collectionView.dequeueReusableCell(withReuseIdentifier:“ tabCell”,用于indexPath)用作TabCell)。 由于将所选索引的颜色设置为彩色更好,因此我们应该在此处进行设置。 我将选定的“索引”标签设置为蓝色,没有选定的标签为黑色。 在您的Delegate扩展中,创建didSelectItemAt indexPath并将您的selectedIndex设置为indexPath.row。 返回到您的selectedIndex声明,并向其添加didSet,以调用新函数setViewController()。 在setViewController(私有函数)中,我们将处理将容器视图更新为所选视图控制器的操作。 首先创建一个var viewController = UIViewController(),这将是我们viewController的占位符以及我们将更新的所有值。 然后打开带有默认显示UIViewController的selectedIndex。 我将所有视图控制器都放在导航控制器中,因此可以设置标题和navigationItem按钮。 现在,您可能会问我们将如何跟上视图控制器的发展,为此,我有一个很棒的答案,我已经引用了几次。 […]