在编程中,我们经常使用异步操作。 这可能包括诸如网络,文件系统,数据库,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)来附加错误处理程序。 […]
四月是一个繁忙的月份! 有太多很棒的技术堆栈帖子,以至于我们很难挑选十个。 到4月为止,我们总共有20个热门帖子,其中包括10个隐藏的宝石💎。 来自Netflix , Flipboard , Slack , Twitter , Yelp , Dropbox , LinkedIn,Shopify等的帖子 。 令人惊讶的是,四月份的一个主要主题是移动开发 。 LinkedIn,Yelp和Uber都写了关于Android的用法,而Uber则用Swift分解了对应用程序的重写,Shopify则写了关于构建移动CI系统的文章。 查看以前版本的Tech Stack综述 十大技术栈文章: 我们如何构建Twitter Lite(Twitter) 如果您还没有听说过,那么Twitter Lite是一种“快速且响应迅速,使用较少数据,占用较少存储空间,并支持推送通知和在现代浏览器中脱机使用的功能”,旨在成为您在使用Twitter时使用Twitter的最佳方式。连接速度慢,不可靠,受限或昂贵。 基本上,是精简版的Twitter。 Twitter将其构建为客户端JS应用程序,并使用React,Redux,Normalizr,Globalize,Babel,Webpack,Jest,WebdriverIO和Yarn构建。 作者 : 尼古拉斯·加拉格尔(Nicolas Gallagher) 技术堆栈 : React , Redux , Normalizr , Globalize , Babel , Webpack , Jest , WebdriverIO和Yarn Slack的TypeScript(Slack) 有人在打字TypeScript …事实证明,您一直使用的Slack桌面应用程序非常复杂。 这是一个多线程应用程序,使用JavaScript与Windows,macOS和Linux的本机代码进行交互。 Slack希望能够保证一切都能融合在一起,因此他们转向TypeScript […]
这是示例屏幕截图。 一旦完成开发并为应用商店做准备。 使用Apple开发人员帐户,您可以将您的应用进行测试,然后要求测试人员为您执行测试。 发布: 乐在其中- 在应用商店中发布iOS应用 。 完成此操作后,您将成为iOS的正式开发人员和App的自豪所有者 。 但这当然也是最棘手的部分。 如前所述,在创建iOS应用程序的过程中,我学到了很多东西。 一个主要也是最重要的教训是 不要为这个过程留出一些时间,因为这不是一件容易的事。 我不会在这里涂糖衣。 很难将您的应用程序放入应用程序商店,尤其是第一次。 伙计们,现在不要责怪苹果公司的严格指导方针。 如果要保持App Store清洁,则需要它。 那为什么我说很难呢? 好。 因为要发布应用程序,有很多准则/规则。 这就是您需要的东西, 您将需要完成,运行良好且设计精美的iOS应用。 (当我说设计精美时,我是认真的,Apple希望您遵循他们的《 人机交互指南》 ) 然后,您需要注册Apple Developer Program 。 您将充分利用此功能,并在完成测试版后以及想要认真对待事情时(例如,当您要将应用程序放到应用商店中时)进行注册。(请记住, 每笔费用约为99美元年 ) 在开始发布之前,请仔细阅读《 App评论指南》 。 您不一定必须逐字逐句地进行检查,但是如果这样做,那就很好了。 虽然您开发了出色的iOS应用程序,但Apple会对您的产品进行评论,他们也必须有同样的感觉。 一旦他们批准了您的应用,该应用就会在应用商店中启动。 很多事情都会出错,但是最重要的是将应用程序带到商店 。 所以你不敢放弃。 预留大约2周的时间进行发布。 您可能需要与Apple团队来回交流,否则您可能会在第一次遇到问题。 但是要留出时间。 Apple的应用程序审查团队非常明确,可以让您知道他们对在应用程序商店中发布该应用程序的期望。 因此,与他们沟通并获得所有需要的清晰度。 苹果承诺将在24小时内对任何请求做出答复,最多2个工作日,并且他们确实做到了。 快速提示: 确保在Xcode中调试应用中的所有可能错误。 没有警告信息 ! 如果您上传的版本不是beta版本 ,则在应用程序或其描述中不会提及“ beta […]
在这个故事中,我们将执行以下操作 : 了解什么是信号量 了解信号量如何工作 实施并解释2个示例 开始吧 信号量使我们能够控制多个线程对共享资源的访问。 为了简单起见,让我们考虑以下现实情况: 一位父亲和三个孩子坐在家里,然后掏出iPad … 孩子2 :我想玩iPad !!! 小孩1 :不!,我想先玩… 孩子3 :Ipad! iPad! iPad! *掌声* 父亲 :好的,孩子2,因为您首先问过,并且目前没有人使用iPad,请拿走它,但是一旦完成,请告诉我。 其他孩子,请耐心等待。 孩子2: (5分钟后)我做完父亲了。 父亲:孩子1,有iPad,请在完成后告诉我。 孩子1: (5分钟后)我做父亲了。 父亲:孩子3,有iPad,请在完成后告诉我。 孩子3: (5分钟后)我做完父亲了。 在上述方案中,父亲是信号量,iPad是共享资源,孩子是线程。 注意父亲如何确保一次只有一个孩子使用iPad。 如果将此与编程进行比较,则一次只能有一个线程访问共享资源。 另外,请注意使用顺序,首先询问的是谁(FIFO)。 提示 :共享资源可以表示变量,也可以表示工作,例如从url下载图像,从数据库读取等等。 如果父亲只是把iPad给孩子们怎么办? 飞机飞行到可能损坏的iPad😖的地步。 如果将其与编程进行比较,则多个线程会尝试同时访问同一资源,并且没有任何阻止。 这种行为可能导致争用情况,崩溃,并且显然,我们的代码将不是线程安全的。 线程安全:可以从多个线程安全地调用而不会引起任何问题的代码。
在上一篇文章中,我们介绍了值类型,引用类型并以集合类型结束。 Swift编程入门第2部分—值类型,引用类型,指针和集合类型 之前,我们讨论过变量,常量和类型。 medium.com 今天,我们仍将继续介绍基础知识,但是好消息是在今天之后,您将能够编写一个解决您的数学问题的程序,无论是幼儿园的数学课程,还是使用公式进行的高级财务计算。 初步资料 您应该了解操作顺序(PEMDAS)的概念 如果数学课对您来说太早了,请按以下步骤操作: 括号(从内到外) 从左到右的指数 从左到右的乘法 从左到右划分 从左到右加法 从左到右的减法 而已! 经营者 只要达到三年级,您就已经在编程中看到了大多数操作员。 让我们看看您已经知道的那些。 加,减,乘和除的一种简便方法是将运算符追加到赋值运算符(您仍然可以使用加法运算符使用此方法来连接字符串)。 可选值和零值 好的,我将尝试使其变得容易,但可能会伤到您的大脑。 很好,这意味着您将学习。 当我谈到变量实例化和声明时,我希望您回想一下本系列的第一部分。 我有点掩饰了声明,而是给了您一些实例化新变量的例子。 我很抱歉,这只是为了让您免于一切,直到您准备好为止。 我们可以像这样声明变量
您必须“敏捷”才能赶上现实世界中的“ Python”,不是吗? 你还怎么匹配毒蛇! 好吧,这不仅仅限于现实世界。 在同义的编程语言世界中,它发生的方式完全相同。 工作中的自然? 还是智能命名的编码语言? 好吧,这不是我或您决定的! 我要在此博客中写的是两种语言在各自方面的不同之处。 在开始之前,我必须向读者简要介绍两种语言及其精妙之处。 关于Python: 重要的是要学习目前是按需编程语言的编码语言。 Python是一种这样的语言。 关于Python的最有趣的事情之一是它类似于英语,因此,学习者更容易掌握它。 使用了诸如“ in”,“ not”之类的关键字,并且向某人读出代码不会使听众觉得自己在讲某种奥秘的语言。 另外,Python在代码中没有花括号。 简单明了的语法足以成为初学者使用不久将完全占据主导地位的语言开始其编码职业的理由。 Python有一套称为PEP8的规则,它告诉您如何格式化代码,以便您始终知道在哪里执行操作,因此,无论您是由新手还是由专业人士编写的,都会看到其他所有Python代码。一样容易阅读。 您的代码和Rossum先生的代码看起来相似的事实为您提供了完全追求编码的必要起点! Python历史: 它是一种高级语言,由Guido van Rossum先生在1980年代后期创建。 该语言以素描喜剧团体“ Monty Python”命名,Python最初是在1980年代后期构想的,1989年12月由荷兰Centrum Wiskunde&Informatica(CWI)的Guido van Rossum开始实施,作为ABC语言的继承者(本身受到SETL的启发),能够执行异常处理并与Amoeba操作系统接口。 Python用于什么用途: Python已迅速成为该行业不可或缺的一部分。 Python有许多用途。 全世界几乎所有学科都使用它。 微芯片已在英特尔使用Python进行了测试,它还为Instagram,强大的社交媒体/照片共享应用程序YouTube,Reddit和Pinterest提供了支持。 Python与其他编程语言相比的优势: Python已经存在了几十年,并且这段时间编写的代码已发布给其他开发人员使用,它是一种开放源代码编程语言。 有趣的是,这些代码都存在于“ pypi.python.org”上,或更常见于社区中的“ The CheeseShop”。 只需在您的系统上安装软件,就可以了。 对于您可能会想到的任何用例,都有库,例如某种服务器自动化,图像处理或科学计算。 有用于Web应用程序和数据分析的Python框架。 Python的标准库支持许多Internet协议,例如HTML,XML,JSON,并支持FTP,IMAP和其他协议。 最好的是,程序包索引具有库,例如; 另请阅读Django面试问题 Python在编码领域的排名: 最近,Python一直风靡一时,在Packt Publishing进行的一项调查中被评为第一名或任何类型的dev工具。 此外,《红僧侣编程语言排名》将其列为№3,仅次于JavaScript和Java。 在包括Stack Overflow开发人员调查在内的其他研究中,它也越来越受欢迎。 它也荣登了IEEE […]
编程并不总是要按时完成任务,进行冲刺,构建应用程序或修正错误,有时您想蜿蜒而行,享受旅程。 F#是一种出色的语言,可用于退步,分区,让世界的烦恼消散,并获得一些乐趣。 我知道是异端,但是是的,编程可能很有趣。 当Apple将Swift定位为儿童的理想学习语言时,它总是让我感到震惊,表面上是因为它要使用多少乐趣。 实际上,我想不出一种有趣的语言,即以陈述为导向的思想的陈旧过时的融合,甚至在刚出厂时就已经过期了。 无论如何,足够的咆哮和狂欢,让我们做些曲折的🙂 定点玩法 在介绍收缩函数之前,让我们简要介绍一下fix函数。 本文很好地解释了Haskell中的函数,其基本思想是fix使我们能够将函数的主体编写为普通函数,而fix负责递归。 修复(1 🙂 :是Haskell中的惰性cons运算符,因此上述函数将生成一个无限的1序列。 由于fix负责递归机制,因此我们将重点放在编写简单函数体的内容上。 当然,如果我们尝试在f#中编写相同的函数,那么在f#中并不是那么简单。 让rec fix f = f(fix f) 设ht = h :: t 让一个=修复(缺点1) 我们迎来了一个 进程由于StackOverflowException而终止。 当然这并不令人震惊,我们都知道f#在减少函数应用程序本身之前使用急切的求值方法将函数参数评估为标准形式。 Haskell做相反的事情,它将函数评估为弱头范式,而未对参数进行评估。 之前的大量技术鬼话可能并没有多大意义,因此请阅读这篇文章,以获得关于评估策略的更容易理解的文章。 底线是我们需要在我们的f#定义中引入thunk(函数的占位符)。 你觉得幸运吗,Thunk? 我们可以像这样滚动自己的重击,或者可以利用如下的内置Lazy类型 惰性定点和无限流| F#代码段 使用惰性定点组合器定义的无限流的示例。 www.fssnip.net 修订的懒惰定义使用懒惰的构造函数将我们每个函数应用程序包装在一起。 let fix : (Lazy -> ‘T) -> Lazy = fun f -> let rec x = […]
Optionals是一种新型的数据,我可以用它来解决问题。 它有一个有趣的环,但是作为一个新的程序员进入Swift领域,似乎总是不得不担心这个可选值很麻烦。 可选参数可以分配给任何类型,它表示该属性可以存在,也可以不存在。 当我第一次读到它时,说实话似乎毫无意义。 为什么我需要编写一个值可能为零的属性? 这一定是在开玩笑。 但是可以肯定的是,随着时间的流逝,它们开始出现……随处可见! Swift文档到处都是可选选项,要弄清楚何时获得它,无论是强制拆开还是自然地拆开它,都是一件痛苦的事情。 真麻烦。 但是最近我已经开始了解它,它很棒! 首先,能够在运行时将值设置为nil,然后在闲暇时将其填充是令人不寒而栗的! 不再需要在继承自某些怪物的类中初始化对象,而我甚至不想覆盖它们。 将它们设置为可选,如果您肯定它们将在整个应用程序中存在,请使用Bang运算符! 如果该属性可能为nil,但是其值可以存在或不存在,则将其留给老式的好问号? 我最近的代码已开始使用可选的拆包程序充当我的布尔值。 我有一个多余的地方,在那儿我做了一个Bool检查,然后才拆开我的财产来对其做更多的事情。 我现在可以解开一只鸟杀死两只鸟。 如果属性值为nil,则尚未设置任何内容,如果具有值,则已设置了该值。 就我的代码而言,我的僵尸正在检查它是否可以攻击人。 它的目标属性通常为nil,但是在分配了目标后,它将开始其攻击过程。 如果contactedPlayer返回一个值,则启动攻击计时器并造成一定的损害,否则,将计时器重置为零。 正是在这一点上,我觉得我在所有可选东西上都被卖了。 现在,随着对它的理解的扩展,我越来越多地使用它。 在此代码段中,只要屏幕上发生触摸,位置值就会传递给播放器的newPosition属性。 我的功能将检查每个框架调整过程,直到到达位置为止,然后将其设置为nil,以便停止。 我曾经不得不与许多布尔斯打交道,以确保我的球员移动不太多。 现在,一个简单的可选控件及其展开即可解决所有这些问题。 可选的最棒的用法可能就是这个。 设置许多属性而无需初始化。 我知道所有这些属性都存在,因为我在应用程序加载后立即给它们赋值,而在我需要在代码中使用它们之前。 因此,让所有人都习惯使用可选选项,我觉得一旦我们对它们有了一个不断的需求。 快乐的编码。
此故事描述了iOS开发人员如何应对OWASP Mobile Top 10 2016中的M1类别漏洞。该类别涵盖了平台功能的滥用或平台安全控件的使用失败。 在第1部分中,我们将介绍Apple提供的加密工具以及iOS的其他一些与隐私相关的功能。 文件数据保护 Secure Enclave — A7和更高版本处理器中的协处理器,使用加密的内存和硬件随机数生成器为数据保护密钥管理和Touch ID提供加密操作。 UID —唯一标识符,融合到处理器和Secure Enclave中的AES 256位密钥,对于每个设备都是唯一的。 允许将数据绑定到设备。 文件系统上的所有文件均受数据保护技术保护(可用于文件和数据库API,包括NSFileManager,CoreData,NSData和SQLite): 每次在数据分区上创建文件时,Data Protection都会创建一个新的256位密钥(“每个文件”密钥),并将其提供给硬件AES引擎以对该文件进行加密。 每个文件密钥都用几个Data Protection类密钥之一包装(在Secure Enclave中),并与数据保护类的表示法一起存储在文件的元数据中。 所有文件的元数据都使用文件系统密钥加密,该文件系统密钥是在首次安装iOS或用户擦除设备后创建的。 删除此密钥,用户可以使所有文件不可解密。 数据保护类密钥受UID保护,对于某些类,还受用户密码保护 文件密钥永远不会暴露给处理器。 它们仅在跨系统运行时才用AES引擎和Secure Enclave已知的临时密钥包装。 应在项目设置(包括在权利中)中启用“文件数据保护”,但是默认情况下,对于所有应用程序,所有数据都会被加密,直到首次解锁。 钥匙串数据保护 iOS钥匙串 -存储在文件系统上的SQLite数据库,用于处理密码和其他简短但敏感的数据位。 securityd守护程序根据其“ keychain-access-groups”,“ application-identifier”和“ application-group”权利来确定每个应用程序可以访问哪些钥匙串项目。 从iOS9开始,钥匙串密码数据一直保存在Secure Enclave中(在iPhone 5S和更高版本上)。 钥匙串中有五组项目:通用密码,Internet密码,身份,证书和密钥。 除其他字段外,每个钥匙串项目均包含: 钥匙串组访问(kSecAttrAccessGroup) –允许开发人员的应用访问设备上共享的钥匙串项目; 应用程序必须共享可以在权利中设置的相同捆绑包种子ID。 数据保护等级 (kSecAttrAccessible) —下一节将详细介绍。 iCloud钥匙串(kSecAttrSynchronizable)-允许用户在iOS设备和Mac计算机之间安全地同步其钥匙串项目,而无需将该信息暴露给Apple。 默认情况下,第三方应用添加的钥匙串项目不会同步。 该值应与兼容的数据保护类一起使用(一个不带… ThisDeviceOnly后缀)。 管理元数据,例如创建和上次更新的时间戳,版本号,使用保护类密钥包装的每个项目密钥, SHA-1散列的属性(例如帐户和服务器名称)用于查询项目而不解密每个项目 […]
我想分享一个简单的教程,介绍如何使用Swift 3将文件上传到iOS中的 Amazon S3 。 我们走吧。 我们需要将Amazon S3框架添加到您的项目中。 在此示例中,我将通过帮助Cocoapods来完成此任务 。 2.创建一个Podfile : 平台:ios,“ 8.0” hibit_all_warnings! use_frameworks! 目标’AmazonS3Upload’做 吊舱“ AWSS3” 结束 3.从终端运行下一个命令: 吊舱安装 4.打开生成的工作区。 之后,我们可以使用Pods的框架来实现文件的上传。 5.我们需要导入2个模块: 导入AWSS3 导入AWSCore 6.使用您的凭证设置AWS配置。 例如: 让accessKey =“ …” 让secretKey =“ …” 让凭据提供者= AWSStaticCredentialsProvider(accessKey:accessKey,secretKey:secretKey) 让配置= AWSServiceConfiguration(区域:AWSRegionType.usEast1,凭据提供商:凭据提供商) AWSServiceManager.default()。defaultServiceConfiguration =配置 7.创建一个上传请求: 让url = …文件的URL … let remoteName =“上传文件的名称” 让S3BucketName =“您在Amazon S3上的存储桶的名称” 让uploadRequest = AWSS3TransferManagerUploadRequest()! […]