Tag: 公共领域

iOS中的导航器– Marc StevenCoder –中

在iOS中,存在从ScreenA到Screen B的基本数据流。 您的ViewController A可能具有以下内容: override func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath) { let detailsData = tableData[indexPath.row] let detailViewController = ViewControllerB() detailViewController.data = detailData navigationController?.pushViewController(detailViewController,animated:true) } 您的viewcontrollerB可能有这样的东西: init() { navigationItem:rightBarButtonItem = UIBarButtonItem(title:”Go to ViewController c!”,style:.plain,target:self,action:#selector(didTapGoButton)) } func didTapGoButton() { let followingViewController = ViewControllerC() navigationController?.pushViewController(nextVC,animated:true) } 但是,这有什么问题呢? 大多数开发人员每天都会以标准动作编写此代码。 ViewController的作用: 1,父母 2,孩子 3,老板 在ViewControllerA中,有很多工作要做。 有什么问题? ViewController不是独立的 viewController依赖n有可以做某些事情的父母 ViewController做得太多(流程,演示等等) 解决方案v1:委派 []() […]

运行时– Sam Wuu –中

为什么需要运行时: Objective-C是⼀门动态语言⾔,它替换⼀一些⼯作放在代码运⾏时才处理⽽并⾮编译时。也就是说,有很多类和成员变量在我们编译的时是不知道的,⽽在运⾏时,我们所编写的代码会转换成完整的确定的代码运⾏。 因此,编译器是不够的,我们还需要⼀个运⾏时系统(运行时系统)来处理编译后的代码。 苹果和GNU各⾃维护⼀个开源的运行时版本,这两个版本之间都在努⼒保持⼀致。 运行时常用接口方法 NSObject类定义的方法 运行时库函数的直接调用 运行时相关术语的数据结构 SEL ID IMP 运行时消息发送和消息转发 消息发送: [people writebook:@”156″];会被编译成: objc_msgSend(people, @selector(writebook:), @”156″); objc_msgSend的具体流程如下: 通过isa指针找到所属类 发现类的缓存列表 ,如果没有则下一步 发现类的“ 方法列表 ”(class_method_list) 如果能找到与选择子名称相符的方法,就跳至其实现代码 找不到,就逐步继承体系继续向上查找 如果能找到与选择子名称相符的方法,就跳至其实现代码 找不到,执行“ 消息转发 ”。 消息转发 : 动态方法解析:先问接收者所属的类 ,你看能不能动态添加个方法来处理这个“未知的消息”? 如果能,则消息转发结束。 + (BOOL)resolveInstanceMethod:(SEL)selector // selector : 那个未知的选择子 // 返回YES则结束消息转发 // 返回NO则进入备胎 后备接收者:动态方法解析失败,则调用这个方法 – (id)forwardingTargetForSelector:(SEL)selector // selector : 那个未知的消息 // 返回一个能响应该未知选择子的备胎对象 […]

我在React-Native和iOS之间集成的经验

好吧,这是我第一次使用React Native,但不仅是第一次与本地iOS应用程序集成。 项目配置 通常,我从Facebook官方文档开始: 与现有应用程序集成·React Native 从头开始新的移动应用程序时,React Native很棒。 但是,它对于添加… facebook.github.io 也很好。 必备的先决条件是已安装npm ,即JavaScript的软件包管理器。 一切都非常简单: https://nodejs.org/en/download/ 最后我执行: $ npm -v 我看到我已经安装了版本5.6.0 除此之外,建议安装: CocoaPods ,用于Objective-C,Swift和在Objective-C运行时上运行的任何其他语言的依赖项管理器。 为了便于安装,我使用Homebrew (macOS缺少的软件包管理器)进行安装: $ brew安装cocoapods 好的,您可以开始设置项目了。 在iOS项目中,我创建了一个“ js ”文件夹,其中包含React-Native项目。 首先,在此文件夹中,创建具有以下结构的文件“ package.json ”。 请注意,我的应用程序称为“ StoryReact” 该应用无法生成,“ Yoga-internal.h”文件似乎存在错误。 经过一些在线研究之后,我决定在GitHub上创建一个问题,但是我得到了负面的反馈,我将不得不手动更改框架的代码。 但是我不喜欢它作为解决方案,因此我尝试切换到另一个版本 。 然后我删除: “豆荚” “ Podfile.lock” “ js / node_modules” 在阅读到从0.54到最新版本的版本都给出了相同的问题之后,我回到终端并安装了React-Native的版本0.51.0 。 因此,我将执行与之前相同的命令,以使用pod在项目上安装react-native和依赖项,相反,包括对Podfile的更改: $ yarn add […]

关于设置的一点

1个 我将深入探讨Swift编译器内部。 我认为最好做一点笔记并描述整个旅程的步骤。 目前,我对Swift或LLVM的内部知识一无所知,但对我在大学期间学到的编译器有一些常识。 因此,这些说明对将要跟随我并了解快速编译器实际工作原理的每个人都是有用的。 我将在每个步骤之后写一个简短的摘要。 而且,我认为从公开准备步骤开始非常重要,以便在我的机器或OS发生问题时能够重现环境。 步骤1.获取源代码并进行一些调整 我从探索swift.org开始。 有一个名为“编译器和标准库”的页面,其中包含编译器体系结构的简要概述以及指向主存储库的链接。 可通过github获得源代码。 README.md包含使用Ninja和CMake设置和构建编译器以及创建.xcodeproj的所有信息。 我选择了后者。 〜$ utils / build-script -x 它可能会运行很长时间。 在构建过程中,我试图准备自己阅读swift.org上的所有可用文档。 它指出编译器由几个模块组成,每个模块代表下一个抽象级别:解析,语义分析,SIL生成,优化,最后是LLVM IR生成阶段。 我将重点介绍官方文档中缺少的内容。 生成的Swift.xcodeproj可以在build / Xcode-DebugAssert / swift-macosx-x86_64 /子目录中找到。 当我第一次打开它时,Xcode用一个模式提示向我打招呼: 但是我可以完成任务,并通过一个简单的步骤解决了该问题: 我做了什么? 我为尚未存在的目标BUILD_ALL添加了构建方案,并设置了可执行文件以使用lldb进行调试: 太容易了。 因此,是时候启动并尝试调试可执行文件了,不是吗? 设置断点,按Cmd + R并… 程序以退出代码结束:0 执行并没有在我的断点处停止。 嗯当然了 我尚未将源文件传递给进程。 使用/path/to/working/dir/A.swift和…调整启动时传递的参数 。 程序以退出代码结束:0 在这里我卡住了。 步骤2.探索执行流程 在继续之前,让我们深入了解swiftc的工作原理。 我的意思是,当您通过命令行调用swiftc并将其传递给源文件时,它会做什么。 你知道吗? 我也不。 我认为这非常简单:迅速的编译器读取输入参数,实例化环境,然后启动lexer,解析器,AST分析器等 。 它的工作方式是这样,但前提是您传递了命令行参数的特定顺序。 通常,它只是设置并启动其他程序来编译,分析和链接可执行文件。 […]

我如何编写和发布Swift库以从Scratch下载数据

VolexDownloader为Swift 3 动机:😇 好吧,我一直很热衷于编写一段可以以某种方式帮助他人的代码。 我曾经写一些小应用程序来解决一些琐碎的问题,但是后来我决定写一个对其他开发人员而不是最终用户真正有用的低级API。 想法:💡 大多数应用程序的任务是以一种或另一种方式从Internet或Intranet下载数据。 每次都是同一段代码或创建一个请求,设置会话,创建任务,更不用说管理下载的内容了。 为什么不编写为您处理所有这些事情的一键式API,以便您可以专注于重要的事情,例如处理实际下载的数据。 它能做什么? 💪🏼 它具有以下模式: 使用用户界面: VeloxDownloader带有内置的下载视图,该视图显示下载进度,并且当前可以停止任何下载。 通过此API,您可以控制是否要为任何特定文件下载启用后台下载。 没有UI: 该API使用Swift闭包来返回下载进度,剩余时间和下载的完成状态。 您可以使用此信息来满足您的需求,甚至可以构建自己的下载进度GUI。 该API还允许您为任何特定文件下载启用或禁用后台下载。 设计与代号:🙇🏼 好吧,我在网上环顾四周,并从现有的图书馆中获得了一些动力。 它们要么是用Obj-c编写的,要么仅提供了一个特定的用例。 我想结合所有这些实现,以提供您只需调用的多合一产品即可为您完成工作。 在这种情况下,您只需给它提供文件url,然后它将在特定位置为您下载。 我首先考虑了文件的生命周期。 有关持久性和删除下载文件的设计决策。 库检查temp和应用程序缓存目录中的命名冲突,并相应地删除和/或覆盖。 接下来考虑的是下载以及开发人员选择的各种模式。 实例化了URLSession并根据下载的前台与后台进行了正确的配置。 完成上述设置后,在Xcode控制台上的日志中产生了正确的结果后,我继续使用UI并创建了自定义tableView来显示下载活动。 我选择为此创建xib,因为我知道将来必须将其作为库发布。 为单元格创建了一个xib,为tableView本身创建了一个xib。 然后是将下载逻辑链接到我各自的视图控制器的任务。 好吧,长话短说,我使用协议和通知来实现这一目标。 我的下载程序类发布了有关通过协议和通知下载的文件状态的更新,我的UI类根据下载开始,完成或被用户停止更改了UI组件。 Github🐙 我创建了所有源代码并将其提交到Github中。 我以前从未以库的形式发布过它,所以我不得不重新格式化我的项目结构。 我将所有文件(.swift和.xib)合并在一起,这些文件将成为我的库的一部分。 你可以在这里查看 我创建了一个问题,将所有提供我链接的媒体插入到我的项目自述文件中以显示gif和图片。 一旦我认为我的实现成功,就从开发分支创建了一个pull请求,将所有更改合并到master中。 我通过克隆项目并运行它进行了快速检查。 中提琴,一切似乎都正常。 此时,我创建了一个发行版,并为其指定了版本号。 椰子足🍫 这很容易成为整个旅程中最困难的部分。 部分原因是因为我以前没有发布过Pod,但从中学到了很多。 以下是重要的痛点: 创建一个podspec文件。 这是Pod脚本读取的文件,以了解有关项目的所有信息。 它由您的项目在github上的位置,在cocoapods.org上创建相应的pod版本的版本号,源文件所在的位置,源文件的扩展名等组成。 我只需要假设Cocoapods.org上提供的详细信息对于像我这样的初学者来说就足够了,但是如果需要像我这样的人,我仍然会继续详细介绍整个过程。 确保您的系统上安装了cocoapod。 如果您不确定,请按照以下步骤开始操作。 […]

让我们使用Bitrise自动化Swift构建

现在我和我的客户我们生活在真正的幸福中。 我 :我只是想掌握并自动执行,所以会增加内部版本号,进行编译并提交给Testflight。 他 :我不再将IPA文件拖放到iTunes中。 Testflight通知我,我可以访问开发人员提交的最新版本。 在Apple环境中,我们是安全的,但Bitrise是面向开发人员的开源持续集成工具。 现在,让我们澄清一下什么是自动化 。 配料 Xcode 7.3.1 存储在版本控制存储库中的Xcode项目(Swift或Objc) 一个存储您的存储库的git服务器( Bitbucket 和 Github 可以正常工作) 开发人员帐户,Apple电子邮件和密码。 密码应为字母数字。 可以从 iTunes Connect 获取的应用程序ID 一个免费的 Bitrise 帐户 应用程序的分发配置文件 有效的证书( 从钥匙串 导出的 .P12文件 。向其中添加密码。) 如果使用 Cocoapods,则为Podfile 。 食谱 打开Bitrise,然后使用您喜欢的GIT服务器登录。 我更喜欢Bitbucket,因为它们提供5个免费的私人存储库。 选择项目的存储库。 将ssh密钥添加到您的GIT服务器。 我让Bitrise自动执行此操作。 此ssh密钥将帮助Bitrise无需任何密码即可克隆存储库。 选择分支。 该分支应该是分发分支。 Bitrise将立即开始构建项目。 这是重要的一步,因此请务必小心,直到看到消息Validation👍🏻! 然后将一个Webhook添加到您的GIT服务器。 推送到GIT服务器时,Webhook很有用。 挂钩将在推送后通知Bitrise开始构建。 这也称为触发器 。 现在打开工作流程并进行管理。 将您的配置文件和证书添加到“代码签名和文件”页面。 在此输入.P12的密码。 […]

如何在Vapor项目中集成PostgreSQL提供程序

表中的内容: 在项目中包括提供商 创建PostgreSQL配置文件 将PostgreSQL提供程序导入项目 将提供者添加到Droplet并查询数据库 在项目中包括提供商 在https://github.com/vapor上搜索提供程序存储库。 在文件Package.swift中包含该URL vapor / postgresql提供者 postgresql-provider-Vapor Web框架的PostgreSQL提供程序。 github.com 创建PostgreSQL配置文件 创建新的机密文件夹。 创建新的postgresql.json文件并介绍配置数据。 { “主机”:“ 127.0.0.1”, “用户”:“ manuelbordallo”, “密码”:“”, “数据库”:“ manuelbordallo”, “端口”:5432 } 将PostgreSQL提供程序导入项目 将库导入main.swift文件 导入VaporPostgreSQL 将提供者添加到Droplet并查询数据库 使用PostgreSQL提供程序更新Droplet初始化。 获取PostgreSQL驱动程序实例。 查询数据库。 让drop = Droplet( 提供者:[VaporPostgreSQL.Provider.self] ) drop.get(“ version”){在 如果让db = drop.database?.driver as? PostgreSQLDriver { let version =试试db.raw(“ SELECT version()”) 返回尝试JSON(节点:版本) }其他{ 返回“无数据库连接” […]

Kin-与.pbxproj合并的头痛药

这是“ 全部与工具有关 ”周期 的第一篇文章 。 所以, 很久以前…我已经找到了 合并冲突经常给我们带来很多乐趣。 通常,您的SourceTree报告如下所示: 在这种快乐的情况下,您可以合并pbxproj。 在我的整个职业生涯中使用不同的合并工具,最终得到了http://www.barebones.com/products/TextWrangler/-友好而性能卓越的文本编辑器。 但是,主要问题是验证。 Kin可以理想地满足对手动合并结果进行验证的要求。 我的合并结果最近: 到目前为止,我做了什么? 根据我的直觉,刚刚解决了四个冲突。 重新开始合并可能是浪费时间的选择,但是我确实有亲戚。 su-macbook-2e23:some_dir petr $ cd path_to_project / su-macbook-2e23:path_to_project petr $ kin ANTLR运行时和生成的代码版本不一致:4.6!= 4.5.2 ANTLR运行时和生成的代码版本不一致:4.6!= 4.5.2 错误:第4078:207行的输入’wrapsLines’不匹配,期望为’}’ 错误:行13742:4输入’LastTestingUpgradeCheck’不匹配,期望’LastUpgradeCheck’ 错误:第13743:4行的输入’LastUpgradeCheck’不匹配,期望为’}’ 太完美了吧? 我可以在4078和13743行上手动找到错误吗? 我相信不会 使用pip-Python软件包管理器,安装很简单。 用法很简单: 导航到项目目录 输入“ kin” 解决冲突,建立成功的时间有一些🍻