Tag: JavaScript

点燃! React Native样板套件!

React native是一个很棒的工具,但是使用React-Native开始一个新项目根本就不那么出色。 考虑所有需要安装的工具可能会让您头疼。 典型的最佳实践RN应用程序包括redux , react-navigation , r18n 。 还有一些更专业的库,例如redux-saga 。 首先,您必须安装它们并使它们协同工作。 这需要时间并且需要努力。 如果您对此感到厌烦,请见面, 点燃 ! 如上所述,根据您要启动的项目,开始一个新项目可能要花费一些时间。如果我告诉您可以将其减少到几分钟并将剩余的时间用于实际编码,该怎么办。 它比您想象的要简单。 让我解释一下该hack会被点燃,它实际上是做什么的? Ignite是React Native的生成器,带有样板,插件等。 Ignite团队已发布了第二个版本,称为Ignite CLI 。在第一个版本中,您可以选择一个-Infinite Red的样板-现在,您可以从许多样板中进行选择,还可以根据需要添加独立的插件。 让我们使用Ignite进行第一个React-native应用程序。 Ignite有一个非常简单的CLI,但是首先我们必须安装它。 只需在您的终端中输入即可。 npm install -g ignite-cli 提醒:Ignite CLI必需的纱线已安装在系统上。 安装ignite之后,我们可以创建第一个应用程序。 ignite new MyNewAppName 在创建过程中它将询问您一些问题。 您可以选择是否要安装它们。 等待几分钟,然后您应该会看到类似这样的信息 ———————————————- ()( )\)((/()\)*) (()/()\))(())(()/(`)/(( /(_))(()/((((_)\ /(_))()(_)))\ (_))/(__))_ __((_)(_))(_(_())((_) | _ _ | (_))__ | […]

Sushi解释模型-视图-控制器

了解MVC模式和辣蛋黄酱 模型-视图-控制器(MVC)模式将Web应用程序的输入,处理和输出分开,并以三个易于理解的部分组织交互:模型,视图和控制器。 …如果我们像寿司店那样想的话,甚至更容易理解。 我进入章鱼DTLA,这是USC学生的便宜寿司场所和赛前场所。 我坐在寿司吧,看厨师马克,点菜。 “请给我一个红色的龙卷。” 我是用户 , 我的寿司订单是请求。 对我来说,我的订单是美味的金枪鱼和鳄梨奶油(见上图)。 当我说出我的订单时,对于像马克这样有经验的厨师,他知道该做什么。 马克的大脑是控制者。 他认为滚动是一系列步骤: 煮饭。 将金枪鱼,鳄梨和黄瓜切成1厘米见方的棍棒。 将寿司从里到外滚动,将食材和辛辣的蛋黄酱作为馅料。 切卷。 撒上飞鱼子,炸洋葱和黑芝麻。 对Mark来说,此过程类似于制作加州卷或费城卷,但根据每个订单的独特成分而有所不同。 如果我点炸鸡怎么办? 马克在值班。 他不能把自己的职位留在寿司吧后面。 他只能使用我们提供给他的工具和资源。 这个有限的工具集就是模型,在我们的示例中包括寿司刀,竹辊,他的手,芥末,鱼的种类,调味料等。完成的卷就是视图。 视图由模型的有限选项构建而成,并通过控制器进行排列和传输。 让我们退后一步,从产品管理的角度思考为什么这种MVC模式很棒。 假设您的客户想要重新设计您的应用程序。 如果您将视图和逻辑结合在一起,则重新蒙皮很烂。 确实,主要优点是MVC使模块化的模型类无需修改即可重用。 MVC体系结构将关注点分开,并允许独立进行推理。 这是创建用户界面的非常有效的创新方法。 通过创建彼此独立的组件,开发人员可以快速轻松地在其他应用程序中重用,并进行修改而不会影响整个模型。 TL; DR: MVC或模型视图控制器是一种架构模式,通常以流行的Web框架的形式使用。 模型-模型代表知识。 它们可以是单个对象,也可以是对象的结构。 它们构造和存储数据,然后根据控制器的命令进行准备和检索。 在电话应用程序中,模型对象可以是游戏中的角色,通讯录中的联系人。 用数据结构的术语来说,模型就是图。 视图-思考UI。 用户可以看到视图,并根据他们的操作显示数据。 它与单个DOM节点相对应,并且可以由子视图组成。 用数据结构的术语来说,视图就是树。 控制器-决定用户的视图输入是什么,并将这些命令发送到模型,并将模型数据提供给视图和系统。 解释用户操作,例如单击按钮。 有时,基于框架,可以与视图结合(例如在Backbone.js中)。

在iOS的Swift 3中编写Cordova插件

本文是对我在2016年4月写的一篇文章的更新,并且已被修改为使用Xcode 8.2支持的“现代” Swift 3语法。 此外,它已更新为使用Cordova 6.4.0。 您可以在 此处 找到使用Swift 2语法的原始文章 。 自2008年App Store首次开放以来,希望开发iOS应用的开发人员必须学习Objective-C。 这包括那些选择使用Apache Cordova的混合模型的人,因为在Objective-C中还编写了可扩展Cordova覆盖本机API的插件。 长期以来,这是可用于iOS开发的唯一语言。 事情在2014年发生了变化,当时苹果在当年的全球开发者大会上发布了Swift编程语言。 从那时起,苹果一直在不断发展Swift语言,分别发布了版本2和版本3,并更新和改进了语言语法,并于2015年底开放了源代码。这引起了人们对于使用该语言进行本机应用程序开发以及其他方面的极大兴趣。 Cordova混合应用程序开发人员可以继续使用平台生态系统提供的出色的现成设备API插件,但是经常需要编写特定于项目的插件。 虽然Cordova的CLI生成的核心应用程序代码继续使用Objective-C,但是开发人员现在可以在制作自己的插件时在Objective-C或Swift之间进行选择。 让我们看一下复制在上一篇博客文章中使用Objective-C构建的“ ModusEcho”插件所涉及的内容。 这次,我们将使用Swift作为本机代码。 回顾一下,此插件借鉴了Cordova文档中的“ echo”示例,并具有两个功能: echo:带有字符串参数,显示“ Toast”(本地对话框,显示在短时间后自动关闭的消息),并将传递给它的字符串返回给调用者 echojs:带有字符串参数,将传递给它的字符串返回给调用方,完全用JavaScript实现,没有本机代码 初始插件创建 和以前一样,Plugman可以通过创建插件支架来帮助我们前进,就像Cordova CLI对新应用程序所做的一样。 我们可以创建一个新的“ ModusEchoSwift”插件,如下所示: 插件创建-名称ModusEchoSwift –plugin_id com-moduscreate-plugins-echoswift –plugin_version 0.0.1 –path modusechopluginswift 这不会将任何输出记录到控制台,但是会在“ modusechopluginswift / ModusEchoSwift”中设置支架。 在该文件夹中,我们可以找到Plugman生成的样板plugin.xml: ModusEchoSwift 让我们更改“ clobbers”元素,通过更新plugin.xml使其看起来像“ modusechoswift。”,使Cordova应用程序可以访问我们的插件函数: ModusEchoSwift 保存更改后,我们现在可以查看插件的JavaScript界面​​。 实施通用JavaScript接口 Plugman创建的初始JavaScript模块“ www / […]

React Native:刷卡,文本输入,动画和手势响应器

这周,我对React Native进行了第一次“认真”的尝试,发现一些令人惊讶的令人讨厌的东西,而文献记载却很少。 我希望这对其他人(或有更好解决方案的人)有所帮助。 让我们从刷卡开始 作为非iOS开发人员,我实际上不知道该模式的正确名称,Apple却喜欢将其命名为UITableViewRowAction。 不幸的是,React Native没有包含如此出色的现成解决方案。 由于缺少正式的解决方案,我跳到coach.js上,找到了希望有人已经编写的组件。 我选择与react-native-swipeout一起使用。 这是一个非常不错的图书馆简单图书馆,我或多或少开箱即用。 (注意:NPM版本已经严重过时,我最初只是使用NPM,但没有,只是使用了仓库) 从那以后,我就将它分叉了,用React Native LayoutAnimations替换了动画以减少依赖性(并且我想它会更高效),并且使手势处理对用户来说更加直观。 布局动画 LayoutAnimations是一个非常酷的库,它使您可以轻松地创建动画,并且或多或少都有文档记录。 您可以像这样创建漂亮的动画: LayoutAnimation.easeInEaseOut(); this.setState({elementHeight:1}); //确保它不为0! //设置元素的高度取决于this.state.elementHeight,我们都很好 但是请稍等,如果我将elementHeight设置为0会怎样? 看来React决定进行优化并完全删除元素而没有任何动画! 但是,如果我想完全隐藏该元素怎么办? hacky修复实际上还不错。 (您可以在GIF中看到它的实际效果)。 LayoutAnimation.easeInEaseOut(()=> { //完成动画后,将高度设置为0 this.setState({elementHeight:0}); }); this.setState({elementHeight:1}); 只需将动画设置为1px,然后在动画结束后将高度设置为0,使其消失即可。 这样,动画仍然可以正常工作,最后元素仍然可以完全消失。 TextInputs +滑动和手势响应器! 现在,我认为这是困难的部分。 该应用程序的部分需求当然是即使您在TextInput顶部开始滑动,也能够滑动出删除按钮。 默认情况下,如果点按了TextInput,它将“窃取”并“锁定”该手势至其自身,拒绝将其放弃给其他任何人。 如果您要在Swipeout中嵌套TextInput并期望Swipeout处理滑动,则这是个坏消息。 根本原因是什么? 这条线在这里。 那条线到底是做什么的? 好吧,这变得有些困难。 React Native中的大多数手势都建立在Gesture Responder系统之上。 当手势开始时,因此当您的手指第一次与屏幕接触时,它将找到“最深”元素,并询问是否要处理手势(使用onStartShouldSetResponder)。 TextInput总是要求处理输入(禁用时除外),就在用户第一次进行联系时(不知道此点击是否会变成滑动)。 现在,当用户开始拖动手指,并且手势响应器现在意识到这是“移动” /滑动时,它将再次询问元素是否要处理移动手势。 现在的问题是Swipeout想要处理移动手势,但是当Swipeout要求处理它时,手势响应器会询问TextInput(通过onResponderTerminationRequest)是否可以放弃对手势的控制。 由于某种原因,TextInput被编码为始终拒绝请求,因此我的Swipeout将永远无法处理TextInput内的手势。 手势响应器文档中的生命周期段落在手势操作中如何调用不同功能方面也非常全面。 同样的想法也适用于PanResponder(高级手势响应系统),如果您使用PanResponder,请参考GestureResponder的生命周期,因为它的本质是相同的。 […]

Redux —我如何理解?

初次见到Redux时,乍一看似乎有些令人不知所措。 但是,如果您想有效地使用Redux,则必须了解它的工作原理以及其核心要素。 状态…动作…减速器…存储…在今天的帖子中,我想向您介绍Redux,以便您可以了解其工作原理。 什么是Redux? 如果您完全不熟悉Redux,则可能需要先检查Redux文档。 Redux是JavaScript应用程序的可预测状态容器。 它可以帮助您编写性能一致,在不同环境(客户端,服务器和本机)中运行且易于测试的应用程序。 最重要的是,它提供了出色的开发人员体验,例如实时代码编辑和时间旅行调试器的结合。 请记住,您无需成为Web开发人员即可在您的应用程序中使用类似Redux的架构。 在各种平台上都有很多这样的想法,ReSwift就是其中之一。 档案(州) 如果我问您,应用程序中的状态是什么样的,那么很难立即解释它。 一些值存储在视图模型中,有些存储库也存储一些值……哦! 那里的类​​知道当前正在登录的用户。但是,如果在这样的问题之后我们可以立即显示应用程序的状态呢? 对我们来说,以这种方式订购的应用程序难道不是很容易吗? 在这种情况下,Redux会为我们提供解决方案。 想象一下,您的状态就像存档,您完全知道在哪里寻找事物,并将其存储在一个结构中。 当然,具有较大的结构并不表示将是一团糟。 您可以将状态存储在归档抽屉中,这些抽屉将代表登录屏幕,设置屏幕等的状态。 字母(动作) 所以……现在我们的档案中有一个整齐的结构化状态,所有内容都很干净,并且易于推理。 但是,正如您可能期望的那样,我们的用户很有可能希望以某种方式更改此状态(我想这并不是什么新鲜事物)。 我们该如何处理? 好吧,我们不能直接访问我们的应用程序状态并更改我们想要的内容。 那不是您使用干净存档的方式……让我们想象一下我想更改我的地址。 我不能只是走进市政厅去玩他们的档案。 我需要写一个正式的字母。 标题:约翰·多伊(John Doe)—地址更改 您好,我刚搬到另一所房子。 我目前的地址是Art Street 10。 不用担心,当我们更改应用程序的状态时,我们只需要关键信息。 因此可能看起来像这样: 但是,有时我们无法立即准备此类信件,因为我们还没有所有必需的数据。 当我需要执行http请求时,我还不知道响应。 对于这种情况,我们必须聘请会计师。 他们将完成所有工作,然后代表我们发送一封信。 例如,在收到服务器的响应后,他们将在信中填写所需的信息并将其发送给我们。 信准备好后,您必须将其发送到市政厅。 有很多人在这里工作,照顾各种事情。 有些人处理您的地址信息,有些人处理您的汽车登记等……他们用您来信中的数据更新档案后,他们会通知您,以便您例如可以更新待办事项列表并划掉“更改地址” …或更新您的Facebook状态。 应用程序内部的reducers也是如此。 如果创建了新状态,则将通知所有对此更新感兴趣的地方。 市政厅员工(减速机) 正如我说的那样,在市政厅里,有很多人在照顾各种事情。 这些是我们应用中的减速器。 想象一下,在收到我们的信之后,该信将交给cityHallDirector,后者将其呈现给该市政厅中的每个工人。 他们中的一些人会看一下它,而只是忽略它,因为他们看到他们不熟悉该标题。 但是到某个时候,会有人说:“哦! 我负责地址更改,我必须处理!”。 请记住,要求市政厅工作人员进行任何更改的唯一方法是给他们这样的信件。 “……”是点差运算符。 […]

Firebase:用户注册,登录和数据管理

努力在Firebase上创建新用户? 是否对将多个元素保存到Firebase上的特定用户感到困惑? 不要再看了! 请按照以下步骤操作,您将可以很好地在Firebase上填充用户群。 如果您尚未在项目中设置Firebase,请查看Will的博客以获取指导。 设置用户授权和数据库规则: 转到您正在处理的项目的Firebase控制台,然后转到Authentication(位于Firebase左侧“开发”下)。 导航到“登录方法”,您将在其中看到每种用户登录方法的默认状态均已禁用。 在本教程中,我将仅启用“电子邮件/密码”,尽管在Stack Overflow上使用Google / Facebook等登录用户方面有很多建议。 继续,然后单击将鼠标悬停在“电子邮件/密码”上并将状态切换为“启用”时显示的铅笔图标。 大! 接下来转到“数据库”,位于Firebase左侧“身份验证”下。 导航到“规则”。您将看到Firebase写入了默认规则(也在下面显示)。 当前,这些规则说的是“如果存在授权用户,则您可以读取保存的数据并将更多信息添加到保存的数据中。” 如果要创建特定于用户的组,则必须添加特定于该组的规则。 仅供参考-Firebase将任何组称为“子级”。您的数据库规则应类似于以下所示。 是时候开始使用XCode来开始执行代码了。 用户注册: 除了UIKit,还将Firebase,FirebaseDatabase和FirebaseAuth导入到Swift Cocoa Touch Class文件中。 如果您不这样做,则XCode将无法识别您将要调用的Firebase函数。 您将需要三个UI项:1)电子邮件的文本字段,2)密码的文本字段,和3)名为“ Sign-Up”的按钮,该按钮作为一个操作从情节提要链接到Swift Cocoa Touch Class文件。 在按钮的动作功能中,我们将编写相关代码。 首先,创建一个与它们各自的文本字段相等的电子邮件和密码属性。 由于文本字段本质上是可选的,因此我选择在guard let语句中解包文本字段。 接下来,检查以确保电子邮件和密码文本字段不为空。 如果它们不为空,则可以调用FirebaseAuth的createUser(withEmail :)方法。 上面的代码中需要注意的几件事-首先,您将看到一个名为“ ref”的属性,该属性等于FIRDatabase.database()。reference()的实例。 为了将数据读取或写入数据库,必须创建参考数据库的实例。 末尾的“根”表示参考的“根位置”。 由于我想将新用户添加到我先前创建的“用户”子级中,因此我在createUser(withEmail :)方法完成时对其进行调用。 在这个孩子中,我创建了一个新的“用户”孩子,其值设置为电子邮件。 尝试运行您的应用,然后单击“注册”按钮; 输入电子邮件和密码后,转到Firebase项目控制台并单击“数据库”,您将看到与以下内容类似的内容。 用户登录: 登录用户的代码与注册用户的代码非常相似。 从下面的屏幕快照中可以看到,注册用户和登录用户之间的主要区别是FirebaseAuth方法。 如果是登录用户,则应使用FirebaseAuth的signIn(withEmail :)方法。 向用户添加数据: 现在玩的开心! 在我的示例中,我正在创建一个由用户组成的“收藏夹”部分。 […]

规范化的TypeScript类型

圣徒布尔,数字,字符串,数组,元组,枚举,任意,无效和从不的经典化简史 圣布尔 公元1326年,伊萨多尔·特鲁(Isador True)在愤怒的一群未定义var的mar难者手中mar难,其范围超出了任何本地范围内对象的属性。 他们在Falsy的旗帜下宣誓效忠邪恶,不仅烧死了Izzy True,而且还烧入了TypeScript Canon of Saints。 圣号 在公元47年的一次寒潮中,一个鲜为人知的门徒的渔船带着他冻僵的尸体返回,身上充满了神圣的神情。 Saint Number的牺牲同时激发了海上温度计的问世和冰点的推导。 圣弦 斯金格修女的封圣几乎是在她将5,000转换为“ 5,000”的第一个奇迹之后立即建立的。 圣列夫 以前曾是社会精英,衣橱无人能及,Arrayvia的Agnes的conversion依是最漫长的事情。 尽管教会对她对《圣经》的独特诠释产生了最初的抵制,并坚持将其所有各种要素都带进修道院,但曙光还是在公元零世纪至公元一世纪之间降临在我们有福的圣徒身上 圣塔普尔 圣埃雷夫(St. Array)的首批信徒之一是名叫图珀洛·乔(Tupelo Joe)的非利士人,他的前身是一天以前被称为美国南方人的美国人。 图珀洛·乔(Tupelo Joe)在后来的时代被称为流浪汉,他在手帕上扛着各种各样的东西,演奏着后来被称为口琴的琴,只有他是用某种骨头制成的从一种动物和从完全不同种类的植物中获得的某种芦苇。 当圣列夫为他代祷时,他被允许随身携带所有各种财产,这是经《经文经》的解释所认可的:“耶和华对埃玛说,把每样东西都带进去。但由于世界尚未准备好使用Zydeco或烧烤路杀,他被称为St. Tuple。 圣埃纳姆 Enus Enum是一位智者,他在乡下闲逛,按序号重命名。 这样,他来到一本TypeScriptures的副本上,跪下来,哭着说:“最后,我将在其中找到自己的位置。 主啊,带我进去,让我为你服务! 哦,“树”等于7,331…” 圣任何 Antonio Anywhereico花费了很多时间在开放图书馆之间徘徊,就像接受任何夜晚的第三方邀请一样,他陷入困境。 一些HTML表单将他带入了演示区。 他又花了几年时间来寻求在这些提交之子与类型出纳员之间建立一条学说的桥梁。 圣虚空 最初被任命为刺客以杀死圣安妮并防止教义之间的融合,但弗拉德·沃德(Vlad the Void)在向南的途中迷失了方向,顿悟了外表并没有任何改变,但真正感到他在这件事上做了很多事情内部。 我们认为,这被认为是一项《法令》,并且在他实际去世之前已将其册封。 圣永不 在某些附带遵循TypeScriptures变体版本的边缘派别中,Never永远不会被视为圣人,这些派别认为此错误图标是所有Code类型的子类型。 作者建议,所有不变的TypeScripture的真正支持者都将键盘紧贴叛教者,并将其从所有分支的头部移开。

使用节点后端在Swift中将图像上传到AWS S3

众所周知,在任何应用程序中处理图像上传都是棘手的 如果此内容对您来说有点繁重,请看一下我有关移动后端开发的课程。 许多应用程序需要某种图像上传功能,但是实现此功能意味着解决一些不同的问题。 开发人员必须决定要将图像存储在何处以及如何安全地到达那里。 必须使用远程存储解决方案; 您不想浪费服务器的带宽或介质上的磁盘速度。 在异步Web应用程序或移动应用程序中实现此功能会带来另一个问题:如果通过服务器进行身份验证,我们是否真的必须将图像发布到服务器上,然后才将它们移动到永久位置? 亚马逊S3 Amazon Simple Storage Service(S3)可以为我们解决所有这些问题。 S3 存储桶是用于存储文件的存储单元。 在本指南中,我将向您展示如何使用Node.js后端向经过身份验证的用户发布签名的URL ,每个URL都将允许我们的Swift应用程序直接将单个文件上传到S3存储桶。 上传的图片将在其自己的URL上可用。 总览 首先,我将向您展示如何设置存储桶。 然后,我将编写一个最小的Express应用程序,该应用程序生成签名的URL-您可以自己实现身份验证(请参阅我的移动后端开发课程)。 最后,我将向您展示如何使用Alamofire检索签名的URL,然后使用该URL上传图像。 设置桶 首先,注册Amazon Web服务,然后导航到S3仪表板。 选择创建存储桶并输入名称; 我通常使用域名。 将区域设置为俄勒冈州-这对应于“ us-west-2”区域,我将在稍后的配置中使用该区域。 点击创建 。 现在,在存储桶的仪表板上,选择右上角的“ 属性 ”,然后在“ 权限”下,单击“ 添加存储桶策略” 。 存储桶策略由一些看起来很神秘的JSON组成,但是我们在此处添加的策略仅允许任何人查看存储桶中的任何文件。 复制以下内容并将其粘贴为存储桶策略,然后点击保存 。 { “ Version”:“ 2008-10-17”, “声明”:[ { “ Sid”:“ AllowPublicRead”, “效果”:“允许”, “校长”:{ “ AWS”:“ *” }, “ […]

我见过天堂。 它是用JavaScript编写的。

为什么React Native是未来 我有一种怪异的软件描述方式。 而且您要么知道我的意思,要么您不知道。 有点奇怪,但是软件界面感觉很重 。 使用界面时,它可能会感到沉重,或者感觉到光线较轻。 两者都不比另一个更好。 这只是取决于。 铬很轻。 Safari感觉较重。 Firefox感觉最重。 可能是胡说八道,但这就是我的感觉。 在我的软件开发生涯中,最重的感觉之一就是在Xcode中使用Swift。 哦,好痛。 延时。 Kanye-West编译器永远不会让您完成。 过去几年,我一直生活在这个笨拙的世界中,以我所知道的唯一方式来构建应用程序:原始,手动,单平台代码。 本地化! 对? 当我了解React Native时,我感到怀疑。 一次用JavaScript编写代码,然后在iOS和Android上部署本机应用程序? -这很烂。 所以我忽略了它。 相反,最终写了两个单独的本机应用程序,一个在iOS的Swift中,另一个在Java / Kotlin的Android中。 这是用JavaScript编写的Web应用程序和基于Electron的桌面应用程序的补充。 (该应用程序是一个加密的跨平台笔记应用程序,因此每个平台上的可用性都是关键。) 这在一段时间内效果很好,但是有困难。 我可以编写Web应用程序和iOS应用程序,但是我对Android毫无经验。 实际上,我一生中从未使用过Android设备超过一个小时。 幸运的是,社区贡献者很乐于帮助构建基础知识,这使我放弃了从头开始编写应用程序的工作,而只是通过增量更改来维护它。 每当需要进行更改或添加功能时,我就需要进入三种不同的代码库,并用三种不同的语言编写相同的代码。 作为一个人,这并不总是很有效。 即使是最简单的跨平台更改,也可能需要一周的时间。 结果是应用程序永远无法拥有美好的事物。 例如,几个用户要求向应用程序添加密码和指纹锁定的功能,这是对具有安全意识的Notes应用程序的非常合理的要求。 但这的实现并非易事:首先,除了输入接口外,还需要密码设置接口。 然后,使用密码对离线用户数据进行加密。 然后,在移动设备上,指定何时应要求输入密码或指纹(立即或退出应用程序时)。 用Swift编写所有这些代码,然后是Java,然后是JavaScript的想法是一场噩梦。 我无法自己去做。 一定有更好的方法。 输入React Native 我必须描述为应用程序维护单独的代码库后的上下文和情感,以便您了解当我开始使用React Native时的愉悦感。 在用Atom (!)编写本机应用程序的第一周,我不屑一顾。 我简直不敢相信这是多么容易。 没有Xcode,没有Swift,可以立即重新加载更改,使用易于使用的JavaScript编写代码-我当时就在天堂。 在编写代码时,我会并排放置iOS模拟器和Android模拟器,并花了一半的时间完全无法相信一切正常。 我从来没有想过, […]

未来就在眼前– iOS和异步开发

在编程中,我们经常使用异步操作。 这可能包括诸如网络,文件系统,数据库,UI,长时间运行的任务或任何其他I / O事件之类的东西。 在iOS中,我们有许多机制可以处理此问题,包括GCD,NSOperation,NSNotifications,委托和回调。 期货是一种在iOS上不那么常见的结构,但已经很成熟,在其他语言(例如JavaScript和Scala)中更常见。 也称为诺言,延期,任务或异步; 该技术允许您以同步方式处理异步值,将连续传递样式的调用切换为直接样式。 通过使用期货,您的程序将更容易推理,因为不会有太多的嵌套调用。 但是未来到底是什么? 未来是对尚不可用的值的表示。 当您与未来合作时,您将不知道该值当前是否可用。 但是,您可以使用该值,就好像它可用一样。 价值一经获得,将来便会处理您的指示。 期货框架 如果您想在iOS应用中开始使用期货,则可以选择以下两种不同的第三方库: – BrightFutures – PromiseKit – FutureKit – 递延 – 螺栓 根据您选择的库,您将有不同的设计选择可以使用。 例如,Big Nerd Ranch的Deferred库的灵感来自OCaml的Deferreds。 这意味着将来/延迟值不会说明异步操作是否失败。 要表示失败,您需要通过返回Result类型或类似的关联枚举来将其表示为值的一部分。 BrightFutures遵循Scala的承诺和未来,因此有一个隐含的理解,即每个未来都可能失败。 FutureKit和Bolts还包含“已取消”状态,该状态表示用户何时取消了将来/任务并且不再关心结果。 这些库可能具有不同的方法和设计目标。 但是,它们都解决了提供一个接口来表示异步结果并使用异步结果的相同问题。 它们还处理共同的任务,例如一起对期货进行排序,并行运行期货以及在特定线程上处理结果。 因此,让我们深入。 只是基础 使用期货的最基本方法是设置完成处理程序。 只要值可用,就可以简单地执行操作。 要设置处理程序,您可以在将来通过调用onSuccess (BrightFutures / FutureKit), 在 (Deferred), 然后 (PromiseKit)或continueOnSuccessWith (Bolts)来设置延续功能。 这些框架中的大多数还允许您通过调用onFailure (BrightFutures), onError (FutureKit)或catch (PromiseKit)来附加错误处理程序。 […]