Tag: swift

使用iOS 10预提取API增强平滑滚动

在上一篇文章中,我们探讨了一些常见的策略来实现iOS移动应用程序中的平滑滚动。 应用这些策略的主要目的是避免混乱的滚动 ,这是对用户体验产生负面影响的常见问题。 为了帮助开发人员完成这项任务,Apple对iOS10中的UICollectionView进行了一些非常有用的更改。 但是,在审查此新引入的功能之前,让我们先检查促使他们需要这些功能的原因。 是什么导致滚动不稳定? 您是否曾经与某个偶尔出现断断续续的滚动的应用程序进行过交互或工作过? 如果答案是“是”,那么当您尝试快速滚动并且应用程序内容似乎断断续续时,您就会知道它多么令人失望。 您可能已经问过自己,是什么触发了这种不稳定的滚动行为以及随之而来的不良用户体验。 简短的答案是:该应用丢帧了 。 但这到底是什么意思? 为了确保一致的平滑滚动,应用程序需要能够稳定显示60 FPS(每秒帧数)。 或者,换句话说,应用程序需要每秒刷新其内容60次。 这意味着每个帧大约要渲染16ms(1000ms / 60帧〜16ms /帧)。 在不幸的情况下,显示一帧所花费的时间比分配的时间长,下一帧将不会显示任何数据,并且据说该应用程序“ 丢弃了一帧” 。 下图说明了这种不幸的情况。 蓝色标记表示绘图操作,其厚度表示完成渲染所需的时间。 如我们所见,在第二帧中,我们发生了一些渲染事件,这些事件花费的时间超过了分配的时间(〜16ms),因此,第三帧已被删除。 我们可以从刷新操作所花费的CPU时间的角度来可视化同一场景。 在下图中,尖峰对应于当应用花费超过预期的〜16ms来刷新当前内容时发生的丢帧现象。 为了获得良好的用户体验,刷新时间必须始终低于允许的最大值〜16ms。 理想情况下,由于我们希望创造出色的用户体验(而不仅仅是一个好的体验),因此每次刷新时间应为: 始终低于允许的最大时间(〜16ms)。 尽可能地低,以节省可用于其他任务的CPU时间。 丢失帧的最常见来源是从主线程为单元加载昂贵的数据模型。 这种情况的典型示例是: 从URL加载图像。 从数据库或CoreData访问项目。 在iOS10中,Apple对单元格的加载和显示方式进行了一些优化。 让我们看一下iOS10可用的改进,以及它们如何使开发人员更轻松地创建流畅的滚动用户体验。 iOS9中的单元生命周期 UICollectionViewCell的生命周期可以如下所示: 集合视图及其单元之间的主要交互是: 收集视图正在请求要显示的单元格的内容,该单元格将要输入可见字段: collectionView(_:cellForItemAt:) 。 集合视图要求显示该单元格- 该单元格刚刚输入了可见字段: collectionView(_:willDisplay:forItemAt:) 。 集合视图正在删除单元格- 该单元格在可见字段之外 : collectionView(didEndDisplaying:forItemAt:) 。 iOS10中的单元生命周期 在iOS10中,单元的生命周期与在iOS9中基本相同。 但是,有一些显着差异。 […]

Swift中的JSON解析—第一部分:JSON解析的通用协议

对于iOS开发人员而言,解析JSON是一项非常常见的任务。 但是,Foundation框架提供的现成功能非常基础。 有许多可用的开源库可实现更高级别的功能,并有望使此任务更轻松,更安全。 作为个人实验,我尝试实现自己的JSON解析库,该库以我真正喜欢的几种方法为模型。 我的实现旨在实现极简主义,并专注于基于通用协议的方法,该方法应允许解析JSON内容,并以最少的代码将其存储在适当的容器( 类或结构实例)中。 为了使复杂性最小化,将没有特殊的错误处理:在不幸的情况下,解析特定的JSON密钥失败,相应的存储值将为nil 。 开箱即用的解决方案 假设我们需要与Web服务进行交互,该Web服务返回如下所示的JSON内容: { “位置”:[{ “ label”:“首页”, “数据”:{ “ address”:“ 6925 Felicity Coves”, “ city”:“ East Davin”, “ state”:“华盛顿”, “国家”:“美国”, “ zipCode”:“ 22998-1456” } }, { “ label”:“工作”, “数据”:{ “ address”:“ 0506 Gretchen River”, “ city”:“亨廷顿海滩”, “ state”:“ Connecticut”, “国家”:“美国”, “ zipCode”:“ 61182-9561” } }] } Swift通过NSJSONSerialization类提供了一种解析JSON的默认方法。 我们可以将JSONObjectWithData用于此类任务,并在确认返回类型符合我们的预期( […]

(ч.1)iOSндексШколаМобильнойРазработкиiOS //Предыстория

Здравствуйте! Этоперваячастьмоейсамойпервойстатьи。 Уменявпланахнаписатьнесколькостатей,вкоторыхяхочуподелитьсясвоимивпечатленияоиокк 🎓 постараюсьописатьвсеотначалаидосамогоконца。 Такжерасскажуосвоихвыводахипланах。 Длякогоэтастатья? Скореедляначинающихпрограммистов,илидлятехктоужепишет,ноимеетслабуюбазу。 Невсеучилисьвхорошихместах,以及некоторымэтопростотяжелодавалось,кпримерувсилувозраста。 Влюбомслучаеобучениеоченьважнодлялюбого。 ,нерассчитываю,чтосмогузаинтересоватьопытныхпрограммистов。 😎 Немногоосередляпервойстатьи 2011年以前的产品 набезызвестномфакультетепоспециальностиИнформационныеСистемыиТехнологииприкафедееМульто 。 在ActionScript 3.0中,使用 новрамкахдипломнойработыяуспелнатаскать 。 Этого мнехватилочтобыполучитьинтереснуюработу。 АчутьпозжеизучитьObjective -C 保罗·海格蒂·斯坦福CS193 iOS的 чтобыначатьписать 。 Послеэтогояумудрилсяпоработать,5компанияхза4года,ив4изнихпростокончилисеетроекты 在360度YouTube上,观看YouTube视频和Facebook视频和照片。 Итак,возвращаюськшколе 2017年10月10日,德国。 Имояисторияначалась4февраля2017года,когдаяшелвморозпозднодомойпосле работыиполучилзабавноесообщениев 电报 отсвоегодруга,которыйвэтовремяпутешествовалпоЕвропе: Тогдаяшелидумал,和зачеммнеидтившколуеслияуже4годаразрабатываюмобильныеприложени 🤷🏼‍Чтояпохожнашкольника? Вотбылабыуменятакаявозможностьвгодыобучениявуниверситете! Эх。 СдругойстороныэтожеЯндекс 。 ПредыдущиеконтактысЯндекс Ранееяужепроходилнесколькособеседованийвэтукомпанию。 Доэтогоуменянебылопроблем。 在Objective-C Runtime中进行注释。 超级 自我 ,以及поокатегории和Какбыяреализовал。 Когдаяпредположил,чтоNSArrayэтокольцевойбуферпопросилиегонарисоватьиподробнообъяснитьраб。 Релокациямассива,когда,какинасколько。 ,решалпроблемунеудачнойхэшфункции,котораявсескладывалаводнукорзину。 Переводизоднихсистемсчислениявдругие。 Построениебазовыхструктурспомощьюуказателей。 […]

UICollectionViewCell动态高度(Swift)

我一直试图使CollectionViewCells动态化,但是在线解决方案要么受到限制,要么根本就不起作用。 因此,我决定根据以下要求进行研究: 以编程方式(无情节提要) 设备方向 基于内容的高度 许多Stackoverflow的解决方案都很复杂,不需要很多代码,因此我的第二个目的是找到一种方法,以尽可能少的代码解决问题。 让我们开始吧! 步骤1 在您的ViewController中 , 创建类型为UICollectionViewFlowLayout的自定义布局,并设置EstimatedItemSize 。 然后,将UICollectionViewController的布局设置为刚创建的布局。

查理和工厂方法模式

在阅读有关“设计模式”或“设计原理”的文档时,我发现大多数情况下创建示例都是非常简单的,足以理解其本质。 这种方法的不便之处在于,很多时候您看不到它所解释的内容的真实应用。 而且,因此,您很难知道如何在现实生活中遇到实际问题时应用这些原理和模式。 前几天,我开始开发Apple TV天气应用程序,以练习Swift并学习如何为tvOS平台开发应用程序。 使其变得更有趣和新颖的想法是让用户从已实施的气象服务列表中选择气象服务提供商。 从一开始,我就意识到这是一个很好的示例,用于解释Factory Method Pattern的工作方式以及如何在Swift中实现它。 从维基百科: 在基于类的编程中, 工厂方法模式是一种创建模式,该模式使用工厂方法来处理创建对象的问题,而不必指定将要创建的对象的确切类。 一个真实的例子 第一步将是在工厂方法中指定要创建的对象的接口,在本例中为Weather Service。 我们还需要一种方法,该方法将为完成的城市及其所在国家/地区在完成处理程序中返回带有天气预报的Weather结构。 在这一点上,我们可以创建自己想要的,符合该协议的任意数量的服务。 例如,我们可以创建实现以从“开放天气地图”和“世界天气在线”服务中提供天气预报(GitHub仓库中的完整实现): 最后一步是创建工厂本身: 现在,每次我们想要添加新服务时,我们都必须: 创建它并实现WeatherServiceProtocol 在枚举中添加一个case,并在开关的相应case中返回其实例化 因此,当我们要使用气象服务时,可以按以下步骤进行: 现在,当用户选择其他服务时,我们只需要用新的服务枚举 case替换.WorldWeather 。 包起来 我们已经实现了一个工厂方法模式的示例来创建气象服务对象,而不必指定将要创建的对象的确切类。 我们通过使用一个非常重要的设计原则来实现这一目标:“编程为接口,而不是实现。”在这种情况下,通过编程为WeatherServiceProtocol而不是不同的具体实现。 设计模式是一般性想法,没有一种实现每个想法的独特方法。 在Swift中可能有不同甚至更干净的方法来实现此模式,在这种情况下,我很想知道它。 因此,不要犹豫,发表自己的想法。 资源: 您可以在以下GitHub存储库中找到WeatherTV项目的代码:https://github.com/dadederk/WeatherTV Swift 2设计模式->第1章:创建模式->工厂方法模式:http://www.amazon.co.uk/gp/product/1785887610/ref=as_li_tl?ie=UTF8&camp=1634&creative=19450&linkCode=as2

如何在NSManagedObject的单个实例上观察更改

在这篇文章中,我将描述如何观察单个NSManagedObject实例的变化。 我写这篇文章的动机是我的朋友,他问我: “您如何观察CoreData中单个对象的变化? 我知道这里有NSFetchedResultsController,但是值得只观察一个对象吗?!” 当然可以使用NSFetchedResultsController,但是它是为不同的事物创建的,如果您阅读文档,则可以找到以下内容: “您使用提取的结果控制器来有效地管理从Core Data提取请求返回的结果,以提供UITableView对象的数据。 (…)尽管可以以多种方式使用表视图,但访存结果控制器主要用于帮助您使用主列表视图。 ” 我的答案是-不要这样。 最有效的方法是观察NSManagedObjectContextObjectsDidChangeNotification 。 当上下文中托管对象的属性值更改时,将发布此通知。 userInfo词典包含以下键: NSInsertedObjectsKey , NSUpdatedObjectsKey和NSDeletedObjectsKey,NSRefreshedObjectsKey 。 如果已经熟悉此方法,则可以看一下我们的包装器,它可以避免编写样板代码。 我根据源代码做了要点,您可以在文章下面和此处找到源代码。 这是我们的观察者界面的样子: 它非常易于使用,您所需要做的就是创建CoreDataContextObserver实例并传递要观察的上下文: 让上下文= NSManagedObjectContext.defaultContext 让观察者= CoreDataContextObserver(context:context) 接下来,您需要传递将要观察的NSManagedObject实例,如果发生更改,您将在完成处理程序中获取有关该实例的信息: observer.observeObject(journal,completionBlock:{对象,状态为 打印(“更改:\(object.changedValuesForCurrentEvent())\ n”) 打印(“状态:\(状态)”) }) CoreDataContextObserver不仅限于一个对象,您可以观察到处于不同状态的许多对象,例如,如果您想了解日记帐删除,则将观察到。 删除状态: reader.observeObject(journal,state:.Deleted,completeBlock:{object,state in 打印(“对象已删除\ n”) }) 这样,您就可以以干净的方式跟踪NSManagedObject上的所有更改。 我在我们的github上创建了示例项目,您可以在其中使用CoreDataContextObserver。 我想说的是,如果您使用 func mergeChangesFromContextDidSaveNotification(_ notification :NSNotification!) 那么您将获得NSRefreshedObjectsKey中的更改。 因此,如果您想使用我们的观察员订阅此事件,将使用: reader.observeObject(journal,state:.Refreshed,completeBlock:{object,state in 打印(“刷新对象”) }) 如果您发现这些资源很有用,或者您是个很棒的人,请按 💚 。 […]

使用Swift Package Manager ArgumentParser处理命令

在命令行应用程序中解析参数不是一件容易的事。 随着时间的推移,应用程序可以演变为支持许多功能,这使得支持的参数数量大大增加。 例如,令人印象深刻的curl命令行工具具有207个不同的参数选项,包括参数和标志。 大量的选择使curl非常灵活和有力。 但是,它也很难使用。 很难学习和掌握。 较新的命令行工具(例如git , gem , carthage或travis通过将其分组在子命令中来更好地组织其功能。 例子: git clone , git fetch , git branch , git commit , git push … gem install , gem update , gem build … carthage update , carthage build , carthage archive … travis login , travis monitor , travis status … 让我们看看如何使用Swift […]

教程:使用Swift 4进行地理编码

使用iOS本机SDK或Google Maps API将地址转换为位置点(纬度,经度)的指南。 地理编码是将邮政地址描述转换为地球表面某个位置(数字坐标的空间表示)的计算过程。 维基百科 在iOS上实现地理编码功能的一种免费,简便的方法是使用CoreLocation和CLGeocoder类。 CLGeocoder类提供用于在坐标(指定为纬度和经度)和该坐标的用户友好表示之间进行转换的服务。 坐标的用户友好表示形式通常包括与给定位置相对应的街道,城市,州和国家/地区信息,但它也可能包含相关的兴趣点,地标或其他标识信息。 有时候,简单/免费/快速的方法不一定是做某事的最佳方法。 在线上有很多地理编码API服务 。 其中一些是免费的,另一些是免费的,例如Google Maps 。 在本教程中,我们将实现并测试iOS本机地理编码和Google Maps地理编码服务以及世界各地的地址列表。 让我们说明一下,在创建我们的项目之前,我们需要做一些简单的事情: 1.1在Xcode上创建一个新项目。 打开Xcode,然后单击文件>新建>项目。 选择单视图应用程序作为模板,然后单击“下一步”并根据需要命名该项目(在我的情况下为BattleOfGeocoding )。 1.2安装CocoaPods。 现在,我们需要设置CocoaPods来管理Xcode项目的库依赖关系。 如果您以前从未使用过它: https://guides.cocoapods.org/using/getting-started.html 此时,我们需要在根文件夹上添加Podfile。 在Github上查看示例源代码。 教程:使用AI和Swift 4。 在iOS上建立自然而丰富的对话体验。 教程:创建一个iOS Swift聊天机器人。 如何设计和创建您的第一个天气聊天机器人应用程序。

框架星期五:爵士乐

欢迎大家回来,我很高兴你们回来了另一个精彩的Framework Friday帖子。 今天,我们将回顾我的个人最爱:Jazzy(https://github.com/realm/jazzy)。 Jazzy是由Realm的杰出人士构建而成的,因此请在此处查看他们:https://realm.io/ 什么是爵士乐? jazzy是一个命令行实用程序,可为Swift或Objective-C生成文档。 与解析源文件不同,Jazzy钩接到Clang和SourceKit中,以使用代码的AST表示及其注释来获得更准确的结果。 输出结果与Apple官方参考文档(WWDC 2014之后)的外观相符。 从本质上讲,爵士乐将使您的生活更加有趣,并使生活变得更好十倍😉 爵士乐在几乎所有方面都非常简单。 安装Jazzy只需从我们的终端执行一个命令: [sudo] gem install jazzy 塔达,都做完了 接下来,我们必须在代码中添加注释。 使用Jazzy会使这个过程变得非常有趣,因为说完并完成之后,我们将获得一个显示我们评论的网页! 在开始记录代码之前,我们需要了解Markdown语法。 基本上,Markdown语法使用特殊字符来格式化文本。 这里有一些资源,其中包含有关Markdown语法的更多信息:https://guides.github.com/features/mastering-markdown/和https://confluence.atlassian.com/bitbucketserver/markdown-syntax-guide- 776639995.html。 让我们看一些基本知识。 1.#此文本现在是标题# 2. *此文本将以斜体显​​示* 3. **This text will be bold** 如果将主题标签放在一段文本之前,它将变成标题。 在此之前和之后添加更多#会更改文本的大小。 在一行文本之前和之后仅添加一个星号将使其斜体。 前后添加两个星号将使其加粗。 很简单吧? *我的无序列表项目1 *我的无序列表项目2 在文本前面仅添加一个星号会将其转换为无序列表(项目符号点)。 1.我的订购清单项目1 1.我的订购清单项目2 1.我的订购清单项目3 同样,不添加星号,而是添加“ 1.”会将您的文本转换为有序列表。 现在我们已经解决了这个问题,让我们将其付诸实践。 在此处下载示例项目:https://github.com/kennyDang/Guides/tree/master/Framework%20Fridays/Jazzy%20Example 在示例项目中,您将看到我们有几个不同的文件夹。 一个叫做协议,另一个叫做模型。 如果您对它们进行了窥视,将会看到一些超简单的文件和已记录的代码。 我们唯一的协议称为SuperCoolProtocol ,只有一个函数称为displayCoolMessage。 我不知道当我们遵守此协议时会发生什么……好事,我们有文档的力量! 我们不必猜测它的作用,因此让我们看一下评论。 […]

CoreGraphics

Usando CoreGraphics在最不发达国家 Quando estamos desenvolvendoémuito comum nos depararmos com是exibir dados para ousuário的必需品。 等于一个普通的fazer is sosenãousandográficos吗? Nesse的指导老师为巴拉斯做了一份解释。 Abra o Xcode e crie um novo projeto,selecione iOS e Single View App。 一个安全的应用程序,它可以在déejasalvá-lo中运行。 Abra o arquivo Main.storyboard。 作为对象库的一部分,您可以在电视上找到自己的名字。 Vocêprecisaráde uma视图,5个文本字段和botão。 Sua情节提要defiáficarmais ou menos assim: 没有高级主管,帮忙编辑。 Segurando是tecla控件,clique e arraste是Partir da Viewatéabaixo da linha 11 nocódigo。 提示音源。 Depois,fasa o mesmo […]