Tag: 迅捷

通过共享资源内存来结合CoreGraphics和Metal的功能

Metal API很棒,它为移动设备和台式设备打开了很多可能性。 但是, GPU有时可能有点笨拙,尤其是在诸如字体渲染或曲线绘制之类的高精度项目中,因此有时您确实会错过旧的CPU优秀项目。 我经常碰巧会想使用CoreGraphics的一些功能,但是保持我的GPU管道快速高效,而没有多余的转换或CPU / GPU同步中断 。 启发我写这篇文章的情况是,使用户能够绘制遮罩覆盖图,以识别希望显示某些效果的区域。 当然可以用Metal来实现绘图,但这需要大量工作:保持路径数据,三角剖分和渲染逻辑。 对于快速原型,仅使用CoreGraphics会容易得多,但是最直接的方法是从UI画布创建CGImage ,然后转换为MTLTexture以将其作为遮罩提供给某些着色器。 多维门户 但是,如果我们希望避免不必要的转换并将CoreGraphics路径直接绘制到MTLTexture中怎么办 ? 这似乎完全有可能! 为了实现这一点,我们必须在某些CGContext和MTLTexture之间共享一个内存缓冲区。 Metal可以从MTLBuffer对象创建纹理,而MTLBuffer则有机会指向已分配的内存。 因此,我们需要执行以下操作: 为CGContext分配内存 创建指向相同内存的MTLBuffer 从MTLBuffer创建MTLTexture 瞧! 实施 免责声明#1:在此演示中,我使用Alloy ,这是我在Apple平台上所有GPU项目中使用的Metal库。 它在香草金属上提供了一个很小的Swifty API 免责声明2:我既不在演示中也不做任何分解,也没有错误处理。 一切都在视图控制器中完成,无论是强制展开还是致命错误。 本文用作参考片段。 当为MTLBuffer分配无副本内存时,事情有些棘手。 为了使其快乐,它必须完美对齐 ,通常为4096字节。 在创建MTLBuffer时, MTLTextures也很麻烦 :我们必须对齐每个纹理行 ,并且对齐方式取决于我们要使用的像素格式 。 幸运的是,这两个任务都是可行的! 为了演示起见,我们将为MTKView上的可绘制单通道蒙版分配共享资源。 每当我们的MTKView更改大小时,我们都会重新分配掩码。 当然不是必须的,但这是最简单的方法。 首先,我们需要从系统中了解RAM页面大小,因此,我们将使用getpagesize()函数。 现在我们必须计算每行对齐的字节数和总分配大小。 为了分配对齐的内存,我们将使用posix_memalign(_,_,_)系统函数。 请注意,从这一点来看,我们负责分配此内存,但是稍后我们将对其进行处理 现在我们准备从此内存创建CGContext ,您可能已经完成了很多次,因此这应该非常简单: 我在这里使用CGImageAlphaInfo.no​​ne表示这是灰度图像,但是您也可以使用.alphaOnly 使用完全相同的内存,我们现在可以创建一个无副本MTLBuffer ,使其负责释放内存。 但是,您当然可以通过将nil传递给最后一个参数来自行管理。 现在,最后一步:我们正在从此缓冲区创建纹理。 纹理的存储模式必须与缓冲区相同。 […]

核心图片样本

要了解Core Image,您需要按顺序阅读以下文章。 每篇文章都附带一个样本。 评论中解释了一些复杂的地方。 如果您无法下载完整的源代码项目,请在此处下载。 好的,我们走吧 核心映像概述 使用内置或自定义过滤器来处理静止图像和视频图像。 查看更多 使用内置滤镜处理图像 对图像应用棕褐色调,高光增强和缩放等效果。 查看更多 侦探 图像处理器,用于识别静止图像或视频中的显着特征(例如人脸和条形码)。 查看更多 CIDetectorTypeQRCode 一种检测器,它在静止图像或视频中搜索快速响应代码(一种2D条形码),并返回提供有关检测到的条形码信息的CIQRCodeFeature对象。 您可以在此处下载完整的源代码项目。

RxSwift简介:iOS开发人员需要吗?

目前,要开发出色的应用程序,需要编写代码,以同时处理用户交互,执行网络操作,管理数据,呈现动态内容等。 这意味着要编写大量异步和并发代码,这可能很难正确解决,甚至难以维护。 这就是响应式编程(特别是响应式扩展)的出现的地方。Swift和iOS的响应式扩展允许编写简洁,易于遵循且灵活的异步和并发代码。 在移动应用程序开发中,Rx相信将带来应用程序开发的重大转变。 尽管许多开发人员发现RxSwift不成熟,因为与其他可用的swift库相比,它是新方法。 但是,那些已经尝试使用这个新的iOS库的人发现,它是处理Swift中难以处理的异步代码的正确解决方案。 使用RxSwift编写可以为Swift编程语言带来全新的体验。 什么是RXSwift? RxSwift是Reactive编程的快速版本。 响应式编程由于其独特的编程范式可以自动更改与控制应用程序性能的更改相关的所有变量,因而具有巨大的意义。 响应式编程是指定义如何对更改(例如用户输入,来自流的数据,系统状态的更改等)做出反应的编程。 RxSwift库是具有反应性扩展的Swift语言版本,就像其他语言(如RxJava,RxJs,Rx.Net等)中提供的一样。它的过程异步代码易于在后台执行,而不会干扰用户设备上的UI和UX体验。 它是Swift中最期待的解决方案,即使用可观察的序列组成异步和基于事件的程序。 “可观察”可以用作通用的,高度可组合的模式。 因此,开发人员不再需要立即使用大量模式,包括完成块,委派,目标动作等。 让我们了解RxSwift实际解决的特定问题。 总而言之,RxSwift允许以声明式方式进行应用程序开发,因此您可以在以下情况下使用它: 被KVO打扰 KVO(键值观察)是在Objective-C中执行的一种实践,它允许向对象通知其他对象状态的特定变化。 尽管KVO具有强大的功能,但由于多种原因,它在程序员中并不那么受欢迎,而是它的显着缺点,即频繁使用时会消耗性能。 另一方面,RxSwift提供了解决方案。 通过最大限度地减少涉及此API的必要性,从根本上迅速地进行了反应式扩展。 您需要同步两个请求。 在许多情况下,开发人员必须调用有助于重新设计当前UI表示形式的API。 这是必需的,因为并非所有REST API都适合为移动平台构建应用程序。 开发人员必须牢记许多布尔变量,并建立一个有助于处理变量互连性的类。 当开发人员使用RxSwift时,它使他们可以结合两个可观察对象并在处理两个API请求结束时发送答案。 您不喜欢与代表同行。 UI开发是必不可少的,因为它会对各种异步任务做出反应。 在Swift中,这些模板称为委托。 委托的作用是使开发人员能够通过异步调用解决问题。 开发人员必须为此编写大量的代码,这需要团队付出巨大的努力,因为使用委托人需要大量的信息。 在这里,RxSwift消除了使用大量委托的严格必要性。 此框架允许进行声明式编码,该编码不会影响UIViewController的大小,并且不再需要objc。 开发人员不必进行繁琐且不负责任的工作,而可以轻松地使代码清晰。 您可能需要编写自己的可观察的东西 在应用程序开发过程中,开发人员需要创建自己的可观察对象时,这是正常现象。 RxSwift在这里非常容易。 使用此框架,开发人员可以轻松地用URLSession包装HTTP请求。 结论:使用Swift进行反应式编程 如我们所见,在专业应用程序开发服务中应用反应式编程可以解决复杂的问题并构建有效的程序。 它会自动加快开发过程,并帮助开发人员专注于可扩展的应用程序。 因此,每个iOS开发人员都应在iPhone和iPad应用程序开发过程中尝试此新扩展。

我不完全是第一个iOS应用程序,关于狗

这个故事很长,始于25年前。 但是,不用担心,我会给您简短的版本。 我一直爱狗。 据我所记得,我们家中总是有一只狗,他一直是我最珍惜的同伴和最好的朋友。 我知道这是陈词滥调,但还是如此。 长大后,狗是我一生中的永恒之物,在每一次疯狂的旅行中都是同伴,无论是真实的还是我想像的,它们都是我的英雄和保护者。 因此,自然地,我必须为他们构建一个应用程序。 25年前,在没有任何智能事物出现之前,我正在玩Mac,并希望构建某种类型的应用程序。 因此,我选择构建一个小型应用程序,以计算狗的年龄(以人为单位)。 现在,与普遍的看法相反,这不仅仅是将狗年乘以7那样简单。它涉及的更多。 但这不是有趣的地方。 有趣的一点是弄乱了我一无所知的系统,并试图弄清楚如何用我不会说的编程语言来创建应用程序,更不用说编写了。 为了使更长的故事简而言之,我只是深入研究了它,并弄清楚了如何制作一些东西。 这是在史前时代,当时互联网几乎是科幻小说,只有极少数人才能使用。 当时我住在委内瑞拉的第三世界国家,我们甚至没有听说过互联网。 我的一个怪胎朋友向我介绍了它,我因此而上瘾。 我简直不敢相信自己所看到的。 但这是另一个故事。 相关的一点是,我开始四处看看,并发现了一些在Mac上进行编程的示例。 我什至不记得它是什么语言,我想它是C。那是史蒂夫·乔布斯(Steve Jobs)回到苹果之前的日子,所以它绝对不是Objective-C(谢天谢地)。 我不知道任何C语言,也从未接受过编程方面的培训,但是我很着迷并阅读了一些有关该主题的书。 我想我会尝试一下,可能发生的最坏情况是我什么也做不了,我会从我刚开始的地方做对,没问题。 我找到了Apple开发人员工具附带的示例程序,并从中推算出 因此,我去了书房,不理my我的女友(现在是妻子),我的家人和我的狗(我知道后者是一种不可原谅的罪过),并开始工作。 我出现了伤痕累累,受伤不堪的阴影,但拥有一个正在运行的应用程序和一个踢屁股图标 ,该图标是我根据当时的美丽拳击手Pata的照片逐像素创建的。 las,那个应用程序和图标永远在以太网中丢失,因为严重的是,谁拥有25年的备份? 不是我,那是肯定的。 因此,快进到2015年,当我们有了第一个( 真正有效的 )Swift和DogCalc版本时,就复活了。 现在成为一个爵士,性感的iOS应用程序! 我不会为您带来任何细节,也不会为我处理Swift的可选控件以及Apple不断变化的实现方式带来更多的痛苦。 这也是另一天的故事。 但是我确实想让您厌倦自定义控件的故事。 特别是圆形 滑块 。 一幅图片值得一千个单词,以及所有这些: 所以我想用圆形滑块设置年份和月份,因为圆圈很酷。 一些古希腊数学家说圆是大自然的完美形状。 原来他错了,蜜蜂是对的,因为六边形是自然界的完美形状。 不过,圈子很酷。 在深入研究代码之前,我先抽出了值得信赖的Sketch应用(喜欢Sketch),然后绘制了所需的UI。 我是iOS开发的新手,但是在征服了UIKit / UISlider之后,我发现圆形滑块是孩子们的游戏。 男孩,我错了! 突然之间,我不得不深入研究勾股几何,PI和Radii以及弧度,到什么程度? 我勒个去? 我只想要一个圆,而不是几何上的PHD !!! 但是正如他们所说的,无论他们是谁,都是休息。 所以我系好安全带,进了书房,不理my我的妻子(仍然是以前被驱逐过的女友之一),我的家人(现在有两个男孩)和我的狗(同样是无法原谅的罪过),现在是名叫萨莎的杰克罗素母狗,漂亮的外观装饰着DogCalc按钮和踢屁股图标 […]

领域与Alamofire融为一体

本文最初由Christoph Auer发表在我们的博客上 我们想向您介绍如何在Hyphe iOS应用程序中使用Swift库Alamofire , Realm和ObjectMapper ,以便在Hyphe API和我们的iOS客户端之间建立优雅而简单的同步。 Alamofire 领域 AlamofireObjectMapper 对象映射器 在Hyphe iOS应用程序中, Realm扮演着核心角色。 对于我们而言,重要的是,Hyphe作为通讯录,具有理想的脱机功能。 我们希望向用户交付一个无延迟且几乎在任何地方都可用的应用程序。 因此,应用程序从Hyphe API提取的来自用户的所有相关数据都将本地存储在Realm数据库中。 该应用程序分为两个部分,前端和后端。 在前端不使用Alamofire 。 所有相关数据都可以通过Realm数据库获得。 后端负责Realm数据库与我们的API之间的同步。 另外,何时修改了Realm数据库,后端就会通知限制性展示者,反之亦然。 此外,将通知后端以使Hyphe-API保持最新。 通过这种设计,演示者非常小巧。 在本文中,我们将通过以下示例扩展后端库之间的交互。 我们从一个简单的示例开始,然后逐步将其升级为最终代码。 GET请求传递以下数据: GET:/ books [ { “id” : 1, “title” : “Book A”, “autor” : “Autor 1”, “genre” : “Drama” }, { “id” : 2, “title” : […]

[RxSwift]观察员

안쓰냐고요?。? 네观察员입니다。 (단호) 观察者 。다。 可观察的도큐멘트로가보면렇게이써있다。 ReactiveX观察者可观察到的。 观察者observable이이이템(들)에다。 observer기서세가지,바로观察者,可观察的그리고subscription(구독)。 자,쓰이시작해시작해보시작해。 위의订阅함수는ObservableType의扩展名런식으이런식으로정의다。 옵저버는만들어지는걸까..옵저버는observable을订阅있었다있었다。 2.观察者대한订阅 이코드가의미하는것은。 우선asObservable은ObservableType의扩展의정의되어다。 Ob로ObservableType을Observable변환해준다는다。 붙는.subscribe(observer)는? serv것도serv serv있는协议serv serv serv serv serv다。 。기본적으로형태를보면이러하다。 안에订阅의해정다형태이다。 해당订阅。다같다。 이위해스에서의이받위해기위해观察者구독한다。 문법 * 0位用户已选择“ Next”(另一位)观察者。 *错误나已完成이시퀀가시퀀스는스아무런지않는다않는다。 이동시에이각기다른스있있지만 리소스관리 *完全错误完全错误完全错误。 *订阅에서에서를다호출한의해해해해하하를를。 값 订阅,“观察者”订阅。 자다다다다다보됐는데。 그러니까观察者대한대한订阅을다거다。 형태리고(一次性)써있다。 다시보자。 그러니까 self.asObservable()。subscribe(观察者) 观察者观察者观察者一次性观察者。 。스트에서이있。이있다。 실제코드를보면 观察者,观察者,观察者,观察者!!!! 观察者观察者观察者观察者订阅观察者订阅。

具有RxSwift的自动完成组件

反应式编程为代码重用提供了很大的机会。 使用RxSwift花费的时间越多,对我来说,将某些行为封装在可以在不同流程中使用的组件中就越直观。 我称它们为“ Rx组件”,既没有革命性也没有惊人的意义。 只是划分和征服Rx代码库的一种方法。 如果您想阅读其他人关于Rx世界的想法,请与我在一起-我们将构建Autocomplete功能。 我所谓的“接收组件”只是一个概念。 没有符合协议,也没有子类。 这是一般的插图: 对于其他开发人员,该组件是一个黑匣子 ,只有输入和输出要插入。 输入和输出在数量上是独立的。 组件实现行为 ,这是应用程序中的一个用例。 仅举几个例子: 自动完成功能—该组件接受简单的文本输入,并提供三个输出: 预测 , 错误和加载状态 (即网络调用或数据库查询)。 表格-接受多个不同类型的输入 。 提供相同数量的输出,每个输出针对相应的输入发出验证结果 。 验证结果可能包含描述数据错误的消息。 分页—接受具有给定索引的页面的输入,发出信号告知何时获取更多页面,并发出信号要求刷新第一页 。 加载状态输出是网络活动的简单指示。 每次组件获取新页面时, 页面输出都会发出整个已知页面集。 每个组件都应隔离,并且不可知 。 通过更改我们编排输出的方式,两者都使其可在不同的屏幕上重用。 一个示例可能是将分页组件的输出加载为在不同屏幕上转换为稍有不同的“等待”体验。 一旦我们构建了组件,就应该很容易对其进行单元测试 。 为了使其无缝,请确保所有依赖项都已被协议很好地抽象。 Rx Component 是一个黑匣子 ,只有输入和输出要插入。 它应该被隔离并不可知,以通过更改我们编排输出的方式使其在不同的屏幕上可重用。 希望您有主要想法。 如果没有,那没关系,我将逐步Autocomplete 在 RxSwift中构建Autocomplete 组件的 RxSwift 证明这一点。 这是我们将要构建的体验(请注意,活动期间状态栏中会显示加载指示器): 在Swift中也一样: 我的Rx组件是类 。 通常,它们符合某种用于依赖项注入的协议( AutocompleteType […]