Tag: Swift编程

使用Grand Central Dispatch进行并行计算和编程

我们将使用原生的Grand Central Dispatch( GCD )框架研究iOS上Swift的并发编程。 如果您不熟悉并发编程,建议您先看一下Wikipedia。 让我们开始研究此API背后的哲学和良好实践。 GCD (Grand Central Dispatch)是一个框架,提供低级API来处理iOS,macOS,tvOS和watchOS平台上的并发编程。 苹果公司提供竞争管理的所有更高级别的框架(例如NSOperation )都基于GCD 。 这些API允许您将流程的工作划分为各个任务,然后使用队列帮助协调并行或顺序执行这些任务。 它使我们能够从线程,处理器或核心的概念中抽象出来,并同时利用其自己的线程池来优化资源管理。 GCD所基于的基本概念是FIFO(先进先出)。 我们要执行的任务将首先插入到这些队列中,然后GCD将单独检索它们,以将它们分派到正确的线程/处理器/心脏。 我们可以区分两种文件: 并发文件:并行执行多个任务 顺序或串行 文件:连续执行一对一的任务 这是现有文件的3类: Main queue :等同于主要处理应用程序UI的主线程。 所有UI调用都必须在此队列上完成。 Global queue :系统为我们提供3个具有不同优先级(高,默认和低)的全局尾部。 这3个文件是Concurrent类型的。 Custom queue :可以手动创建并具有所需类型(串行或并发)的队列。 让我们从创建3个队列类别之一开始: 为了创建自定义队列 ,我们首先定义一个标识符(建议使用反向DNS格式)。 现在我们知道了如何创建文件,如何使用它们? 非常简单,这要感谢“调度员”! 这是一个小例子: 让我们分解所有这些。 我们开始创建低优先级队列。 然后,我们在先前恢复的低优先级队列上异步“分发”代码块。 该代码块异步获取数据以将其存储在data变量中。 最后,我们使用恢复的数据更新主线程中的view 。 在主线程中执行最后一步非常重要,因为UIKit不是线程安全的,并且如果您在另一个线程中更新组件,则应用程序可能崩溃或具有未定义的行为。 控制台将在此处显示: 之前 后 内部异步块 在主队列块内 完蛋了! 使用GCD您可以管理所有有关并发编程的问题。 在本节中,我们将进一步介绍不同的使用情况。 […]

自动布局使用的视图属性

有些视图会根据其持有的内容自动调整大小,这称为其intrinsic content size 。 EG按钮的固有内容大小是其标题的大小加上少量的空白。 并非所有视图都具有固有的内容大小。 对于包含视图的视图,固有内容大小可以定义视图的高度,宽度或两者。 假设我们有一个带有文本“ Click Me”的按钮。 我们绝对不希望按钮小于其内部的文本,否则文本将被剪切。 这就是所谓的Compression Resistance Priority 。 视图的“抗压缩优先级”越高,则视图抵抗增长到大于其固有内容大小的能力就越大。 仍在“单击我”按钮上,如果我们不希望按钮的大小大于其内部内容,如下图所示: 如果我们希望按钮在没有太多填充的情况下拥抱其内容,则必须增加Content Hugging Priority 。 视图的“内容拥抱优先级”越高,则视图抵抗增长到大于其固有内容大小的能力就越大。 我们可以通过编程方式设置内容拥抱和抗压缩优先级,如下所示: 这两个方法采用两个参数,分别是UILayoutPriority和UILayoutConstraintAxis 。 优先级可以是必填项 , defaultHigh , defaultLow , fittingSizeLevel ,其中必填项是最高的,而fittingSizeLevel是最低的。 UILayoutConstraintAxis可以是垂直轴或水平轴。 我将在UIStackview上写另一篇文章,之后我将展示以编程方式编写不同视图的方法。 谢谢阅读。

Pola Arsitektur MVVM pada迅捷

您尝试过MVVM吗? 嗨,😁! Pastikan Anda Sudah Paham Mengenai TableViewController , Extension和 关闭回调 西伯利亚甜菜 苹果merekomendasikan Pola Arsitektur MVC(模型-视图-控制器) 开发者 dalam iOS / MacOS 开发。 Namun dengan adanya ViewController pada Swift,banyak aplikasi yang dibuat menjadi seperti: Dengan ViewController是MVC(Massive View Controller)。 月经MVVM Dengan menggunakan MVVM,维护部门维护Sebuah aplikasi dapat dibangun secara lebih rapi dan mudah untuk di maintenance。 MVVM(Model-View-ViewModel)记录数据和数据数据ViewController和ViewModel。 Dimana ViewController […]

可编码协议

从Objective-C到Swift的过渡当然也取得了成果-尽管有时陡峭的学习曲线和不断发展的语言性质有时可能会带来挑战。 (当然也有挫折 。多年来,iOS处理设备轮换的多种方式越少说越好!) 对我来说,在不遥远的历史中最能引起欢乐的变化之一就是添加了Codable协议。 Swift 5 刚刚发布(并获得了广泛好评),但是-在Swift 4中增加了Codable-对我而言,这是一个更加令人兴奋的发行版。 可编码协议 Codable是一个非常漂亮的Swift协议。 在Swift中(与Objective-C相反),相比于继承,它更加强调组合,使用协议在不使用子类的情况下向类,结构或枚举实例添加功能。 实现协议的类,结构或枚举被称为与该协议兼容 ,从而在该过程中获得了该协议的功能。 可编码的独特之处在于,它实际上只是可Encodable和可Decodable协议的结合的Encodable Decodable 。 一个实例可以独立地符合任何一个,但是如果它同时符合两个,那么它也是可编码的。 这些协议给我们带来了什么? 让我们来看看! 编码利益 许多应用程序的一项常见操作是从API提取内容。 例如,我们的KPCC API客户端下载文章,剧集和节目时间表数据,并将其转换为适用于应用程序的模型实例。 这是解码的示例(也称为反序列化)。 我们使用数据的序列化表示形式(在本例中为JSON),并将其转换为可以使用的形式。 我们还可以反向执行此操作,将数据编码(序列化)为一种格式,该格式可以传递回服务器或以本地缓存的形式保存到用户的设备中。 总而言之,我们得到了一个用于编码/解码的标准化系统,并且有机会删除许多样板代码。 我们的KPCC API客户端项目在很大程度上依赖于使用Codable来获取API响应,并使用它们返回本地模型实例。 基本编码和解码 符合Codable很简单。 假设您有一个结构,只需将Codable协议添加到您的结构定义中,如下所示: struct Cat:可编码{ var age:Int 变量名称:字符串 } 而已! 现在,如果您希望对该Cat结构进行编码并将其保存到用户的设备中,然后将其读回,则可以这样进行: let apollo = Cat(年龄:10,名字:“ Apollo”) 让apolloData =尝试吗? JSONEncoder()。encode(apollo) 让documentsURL = FileManager.default.urls(用于:.documentDirectory,在:.userDomainMask中)。 让fileURL = documentsURL?.appendingPathComponent(“ Cat.json”) […]

Swift中的内存管理,具有强而弱的无人参考

对于iOS应用程序,学习内存管理至关重要。 您正在使用Objective C还是Swift,但是您需要熟悉内存管理将如何有所帮助。 从本文开始,我假设您对Objective C以及对OOP的Swift和清晰概念,闭包,可选和属性有一些了解。 基本上,内存管理是引用计数,在Objective C或Swift中,当您在代码中引用变量时,其保留计数会增加,反之亦然。 如果变量的保留计数达到0,则将释放该变量。 您已经知道swift使用ARC(自动引用计数)来管理应用程序的内存使用情况。 因此,您不必自己担心内存管理。 但是,您需要知识来管理代码中的内存,以避免内存泄漏。 当您创建任何新的变量实例时,ARC会分配内存来存储信息,而当不再需要该变量时,ARC将释放分配给该实例的内存。 您需要确保一旦变量被释放,就无法再次访问它,否则您的应用程序将崩溃。 初始化任何变量或对象时调用Init(),而对象的引用计数达到0时,调用deinit()取消对象或变量的分配。 下面,我编写了示例代码以更好地理解。 实际上deinit块是由ARC自动运行的,但是为了更好地理解,我在这里写了详细的文章,介绍了如何编写适当的代码。 我在那篇文章中用代码示例介绍了以下内容: 使用Swift定义属性时,默认会应用强引用。 在Swift中几乎所有地方都使用了强引用。 类的每个新创建的对象都有引用计数器。 将值的属性分配给对象后,它将增加。 在引用计数器的值大于0之前,它不会被释放。 它允许创建实例,但不增加ARC的引用计数。 大多数情况下,参考标记应被标记为较弱,并且比其他类型的参考具有较短的寿命。 如果将其引用设置为nil,则应使用弱引用。 如果没有其他实例强烈引用该实例,则实例将取消分配。 就像弱引用一样,保留计数器不增加1。 与弱引用不同,无主不必是可选的,因为在解除分配时它们不会自动设置为nil。 仅当您知道该实例的对象永远不会为零时,才应使用无主引用。 注意:只要您知道弱引用会在某个时候变为零,就可以使用它。 当您知道其引用一旦初始化就永远不会为零时,使用无主引用。 最后,如果您不管理内存,那么它会使您的应用程序不稳定,并导致大量内存泄漏。 但是通过谨慎地使用弱者和无人者,我们可以管理内存泄漏并放弃内存。 最初发布在 www.logisticinfotech.com

iOS Huddle#4

2016年12月29日星期四 iOS Huddle是我们每月在Black Pixel iOS团队的Slack频道中共享的最佳链接的摘要。 反应式编程 如今,反应性编程似乎风行一时。 如果您对反应式编程感到好奇,我们认为Cocoa with Love的这篇文章很好地介绍了其背后的一些概念。 Matt Gallagher通过以下原则定义了反应式编程: 可变状态的任何“获取器”都会引起问题。 代替使用getter,任何计算,生成,加载或接收的状态值都应立即发送到通道中,并且想要访问这些值的程序的任何部分都必须订阅该通道。 本文就一些简单用例的KVO有多高提出了一些很好的观点,并概述了我们在使用它时遇到的一些典型问题。 与往常一样,反应式编程可能不是万灵药,但它提供了一种不同的方式来了解如何设计应用程序。 的GitHub GitHub现在允许您直接从PR中解决合并冲突。 对于最简单的问题,这是一个实时保护程序。 对于更复杂的问题,万花筒仍然是我们的最爱。 元编程 DRY是一个好概念,通常不那么容易实现。 有些人认为过早地进行DRYing类似于过早的优化。 其他人发誓。 无论您对DRY感觉如何,我们可能都同意的一件事是,样板代码的实现可能是乏味,重复且容易出错的。 我在看您,JSON序列化和NSCoding! 因此,为什么不使用一些不错的元编程和自动代码生成来替换其中的部分或全部。 这就是Sourcery可以为您做的。 您可以查看该崩溃报告吗? 我们中有多少人被问到这个问题并交出了未标记的堆栈跟踪信息? 没什么好玩的。 幸运的是,Apple写了一篇非常不错的技术说明,标题为“了解和分析应用程序崩溃报告”。 快速游乐场 Swift Playgrounds确实可以帮助您快速制作原型并测试想法。 操场也可以用来隔离一些特定的问题。 PlayAlways可让您直接从菜单栏中快速创建Xcode游乐场。 幕后花絮 当Instagram展示其如何重新设计其Feed时,深入介绍实现细节时,您知道您可能会学到一些东西。 Instagram软件工程师Ryan Nystrom的这次演讲并不令人失望。 对于任何好奇或渴望完善自己的工艺的人来说,这都是必看的。 尝试? 与As? 这是Erica Sadun撰写的简短文章,概述了如何混合尝试? 与作为? 和条件绑定可能会带来意想不到的后果。 我的记忆在哪里? 如果像我们一样,您是Mike Ash深入技术博客的狂热读者,您将对他的GOTO 2016会议演讲感到高兴:对Swift内存布局的探索。 请放大此文本 iOS 7为iOS应用程序引入了全新的视觉设计范例。 […]

在Swift-4中玩闭包(Part -2)

大家好 !! 在上一篇文章中,我们都讨论了Swift中的一些基本闭包。如果您尚未对其进行检查,请进行检查。在本教程中,我们将讨论更多内容。 Swift会自动为内联闭包提供简写参数名称,可用于通过名称$ 0,$ 1,$ 2等来引用闭包参数的值。 速记参数名称 正如我们上面讨论的,Swift 4通过表示$ 0,$ 1,$ 2-$ n来方便用户将内联闭包表示为速记参数名。通过在闭包表达式中使用此速记参数名,我们可以从其定义中省略闭包的参数列表。 in 关键字 由于闭包表达式完全由其主体组成,因此可以省略。请看以下示例。 因此,在第一个示例中创建了一个闭包,该闭包采用单个参数并返回字符串。此处$ 0表示第一个参数。类似地,在第二个示例中,闭包采用两个参数,通过使用$ 1,我们引用了第二个参数。关闭 自动关闭 我们知道闭包可以用作函数中的参数。当我们编写@autoclosure时 ,参数会自动包裹在闭包中。但是,如果我们创建一个具有@autoclosure的函数,则存在一个问题,通常调用该函数具有自动关闭功能的函数,但是实现这种功能并不常见。 让我们举一个小例子。 func simpleFunctionwithoutAutoclosure(_ parameters:()-> Void){ 打印(“嘿,我们刚刚创建了一个没有@autoclosure属性的函数”) 参数() } simpleFunctionwithoutAutoclosure({ 打印(“ hello”) }) func simpleFunctionwithAutoclosure(_参数:@autoclosure()->无效){ 打印(“嘿,我们刚刚创建了一个具有@autoclosure属性的函数”) 参数() } simpleFunctionwithAutoclosure(print(“ hii”)) 并且输出如下 从上面的两个函数中,我们注意到,在@autoclosure的情况下,无需将表达式用大括号括起来。 如果要传递闭包而不是自动闭包,这就是我们需要做的。 逃逸关闭 当闭包作为函数的参数传递给闭包时,闭包被认为是对函数的转义,但是在函数返回后会被调用。 声明将闭包作为其参数之一的函数时,可以在参数的类型之前编写@escaping,以指示允许对闭包进行转义。 Apple的文档给出了一个示例,该示例将传递给函数的闭包附加到您的类/结构中可变的闭包数组中: varcompleteHandlers:[()->无效] = [] func someFunctionWithEscapingClosure(completionHandler:@escaping()-> Void){ […]

记录云原生应用

我的日志文件在哪里? 在回答这个问题之前,让我解释一下上下文。 我在云开发领域工作,我们有一种方法,称为12因素应用程序。 Logs是12个因素之一,这是如何定义该因素的方法。 十二要素应用程序永远不会将自己的输出流路由或存储。 它不应尝试写入或管理日志文件。 而是,每个正在运行的进程将其未缓冲的事件流写入stdout。 在本地开发期间,开发人员将在其终端的前台查看此流,以观察应用程序的行为。 如果您不熟悉12因子应用程序,则可在此处获取有关它的更多信息。 但这对我作为开发人员意味着什么? 答案很简单,我将所有日志都写到stdout。 例如,我迅速编写了下一个很酷的Web服务。 然后,您至少需要这两行内容才能写入stdout。 //禁用缓冲以直接写入stdout setbuf(stdout,nil) 打印(“此行将被打印到标准输出。”) 就是这样,好的,我要说实话,您看到3行代码,但是注释仅用于解释,抱歉。 顺便说一下, setbuf由标准C库提供。 如果您需要不同的日志级别(如调试,错误等),那么您可能对库更感兴趣,库对此提供了支持,并且对日志行的格式也有帮助。 如果我们扩展快速应用程序,那么“ HeliumLogger”将是一个不错的选择。 这个记录器也只写到标准输出,这就是我们需要的一切。 让我们谈谈不同的环境。 如果您在本地计算机上进行开发,则可以在终端中查看应用程序的日志。 但这不是您的应用程序所在的地方。 如果您的应用程序是在Cloud Foundry(CF)提供程序之一上运行的,则可以使用cloud Foundry cli“ cf logs my-swift-app”获取应用程序的日志。 这是可能的,因为Cloud Foundry中的日志路由是由运行时管理的,而输出的一个选项可能是Cloud Foundry cli。 bash $ cf日志打印机-最近 grep APP / PROC / WEB / 0 2017–10–17T22:05:02.03 + 0200 [APP / PROC / […]

用户关闭本地通知后会发生什么?

TLDR:如果将本地通知设置为在用户关闭本地通知权限时触发,则该通知仍会在预期的时间触发(如果用户稍后打开权限)。 本地通知是任何iOS开发人员工具箱中的有用工具。 如果您要构建任何类型的警报工具,则几乎没有其他选择。 不幸的是,许多用户无法区分本地通知和推送通知,并且会拒绝两者的权限。 最近,我正在开发一个应用程序,用户可以在其中注册以获得自己喜欢的事件的警报。 即使用户不允许我发送本地通知,我仍将其设置为在所需时间重复(我不会讨论如何设置本地通知,但这是苹果公司有关如何设置它们的说明)。 那么,那些发送给用户的本地通知怎么了? 更重要的是,如果我说服用户打开权限,通知是否会按计划发送? 让我们设置一个场景: 当用户拒绝了通知授权时,我将本地通知设置为每天2:00 PM重复。 下午1:30,用户授予我发送本地通知的权限。 下午2点会发生什么? 通知是按计划发送的,还是因为初始化时没有权限而从未设置? 在上述情况下,即使我在用户关闭通知的情况下设置了通知,通知也将照常发送。 由此看来,可以肯定地说,如果用户的权限仍然处于脱机状态,Apple只是抑制了您发送的通知。 希望这可以节省一些时间! 非常感谢您的阅读! 如果您喜欢这个故事,请在 Twitter上 关注我,在 那里我发布有关产品管理,工程和设计的文章。

Como Programar en Swift con iOS 12(第3部分)

Bienvenidos a la tercera parte de esta serie de tutorials。 《从前的事实》到《从无到有的事实》 。 从本质上讲,它是一种可组合的,可转换的组件,还可以在ViewController和Podigo中进行修改。 可以从任何人那里得到的东西,可以使您在任何时候都可以使用的东西,可以在任何时候都可以使用。 您可以使用Vamos Hacer或Funcionen! Vamos a mostrar una alerta cuando elbotón“ Calcular” haya sido pulsado。 没有人打扰到我。 Para eso vamos a escribir algo decódigoSwift😎💪 -> 工程浏览器 ,单击ViewController.swift El Interface Builder为 WTF color着色。 Esto es elcódigoSwift de tu应用程序: 的功能,没有接收到Agrega la siguientelíneadecódigodebajo de laúltimallave的信息,didReceiveMemoryWarning didReceiveMemoryWarning() @IBAction […]