Tag: Brian Yencho

如果您的类型名称平庸,则您的代码将构成责任

我创建代码的过程如下所示: 研究目标的细节(学习) 提出实施计划(创建) 代码(单击并键入) 当我意识到我有一个错误的假设时,请返回步骤1(遗憾) 在进行编码工作之前,正确命名类型是计划中的最后一个障碍。 就像,嗯,我知道计算机不在乎我给我命名的类型。 机器解释指令时,所有这些都将被剥夺。 我的功能不会受到影响。 为什么我花了很多时间来确定角色以及事情如何融合在一起? 因为代码不仅仅适用于机器。 适用于必须充分理解它才能正确操作它的开发人员。 该类别中包括“未来”。 要做到这一点,就需要弄清问题集,并有足够的同理心,以使听众可以预期您选择的名字的所有含义。 真名 有一个古老的想法,即如果您知道某事的“真实名称”,那么您将拥有权力。 这是幻想中的常见现象,也是宗教故事的一部分。 以伊西斯和拉的故事为例。 伊希斯(Isis)是一位出色的治疗师,但只有知道她的真实姓名时才能帮助Ra。 他试图用“小写”的名字满足她的要求,但这仅使Ra未能解决核心问题。 一旦他放弃了他的真实姓名,她就可以治愈他。 这听起来像调试我。 如果您不知道所处理事物的真正含义,就无法解决该问题。 懒惰的标签将欺骗人。 您在阅读代码时让人们做的心理锻炼越多,使用它的认知就越消耗精力。 “是的,被称为 Provider 但实际上只是转换数据。” “该 modelId 不适用于该模型,适用于其他通用模型。” 但是,如果您真正知道什么是东西,则可以轻松地对其进行操作。 这很重要,因为将来必须更改代码。 我的理想是功能与代表功能的标签之间的绝对统一。 既然是理想的,我永远都不会到达那里。 想起名字时会出现回报递减的情况,但是值得花一些时间。 在清晰度和可读性之间取得平衡 某物的最精确名称可能是…… 绝对清晰。 把它收拾好。 该名称公然忽略了所有可用的上下文。 显然,这个例子很荒谬,但是添加不必要的限定词可能很诱人。 即使您觉得这个名字不是最好的,也最好在项目内部保持一致,而不要在两个约定之间来回穿梭。 一旦人们适应了您项目的标准,他们就会知道您在说什么。 一致的信息比冲突的信息要好,即使最终效果不佳。 同样,在引入新元素时也不要害怕重命名旧元素,以澄清它们之间的差异。 我们不是用石碑编码。 有些人梦想着将来验证自己的代码并期待未来的变化。 我宁愿使代码清晰地代表当前的情况,并在反映未来的将来进行更改。 这使我省去了很多我无法控制的事情。 我们控制双方 也许您没有花时间准确地命名某件事,因为它正在做很多事情…… 再塞另一种方法 有时正确的答案可能是重构基础实现以启用更好的名称。 我们都可以控制。 […]

如何在iOS上调试后台获取事件

注册您的应用以进行后台抓取,使您可以为用户做各种事情……例如更新图标的徽章计数! 但是您应该如何测试呢? 取回操作取决于操作系统…… 我将向您展示如何调试后台获取解决方案以及遇到的陷阱。 首先,在performFetchWithCompletionHandler设置一个断点,以便我们可以验证测试。 接下来,从Xcode的Debug菜单触发获取: 这应该可以正常工作,但这不是最有用的方案。 如果您想像这样进行调试,则可以直接直接调用performFetchWithCompletionHandler方法。 棘手的部分是重新创建完全不加载您的应用程序的情况,iOS将其唤醒以在后台执行。 这是我们遇到的#xcode问题。 编辑应用程序目标的方案,您将看到一个选项,用于模拟从后台提取事件启动。 在模拟器中尝试。 您将永远等待而不会出错。 显然,这曾经在模拟器中起作用。 但是不再。 精细。 让我们尝试使用该设备。 您可能会认为此错误是有意义的。 也许您需要进入手机上的“设备管理”设置,以验证您是否信任开发者证书。 我一般建议这样做,但是这里无济于事。 据我所知,这是一个通用的“超时”错误。 是什么赋予了? 好吧,这是一个错误。 在iOS 11.0.3之后,此功能就中断了。 如果您使设备保持最新状态(在撰写本文时为11.2.6),则将无法测试设备上的后台抓取。 那么现在怎么办? (编辑:自iOS 11.3和Xcode 9.3起,此功能现在可以使用!感谢Marco Mussini) 希望在Apple解决此问题之前,您可以使用较旧的测试设备。 如果您位于双子城,则可以在Livefront停留并使用运行11.0.3的iPhone 7 Plus(在FinalPass上注册-第一小时免费!)。 以此为警告-始终准备有备用测试设备,以及较旧版本的iOS! Sean在 Livefront 与Xcode有着严格的专业关系 。 ps如果您没有设备,但想验证启动顺序,我已经更新了AppLaunchSequence文档以包括后台获取。

如何将动态Swift框架添加到命令行工具

让我们逐步介绍如何尝试向命令行工具中添加动态框架,并讨论每步操作中出了什么问题。 步骤1:将其添加到“链接的框架和库”部分 这是您运行应用程序时发生的情况: dyld:库未加载:@ rpath / libswiftAppKit.dylib 引用自:/Users/seanberry/Library/Developer/Xcode/DerivedData/TestCommandLineTool-fnrmhjvjmugvqueaqvbklzwhqvuv/Build/Products/Debug/ThirdParty.framework/Versions/A/ThirdParty 原因:找不到图片 ThirdParty.framework尝试在@rpath目录中找到libswiftAppKit.dylib (它是Swift标准库的一部分)。 我们可以看到ThirdParty.framework如何通过运行来定义@rpath $ oTool -l ThirdParty.framework / Versions / Current / ThirdParty 加载命令27 指令LC_RPATH cmdsize 48 路径@executable_path /../ Frameworks(偏移量12) 加载命令28 指令LC_RPATH cmdsize 40 路径@ loader_path / Frameworks(偏移量12) 好吧,开枪。 这些与我们的命令行工具无关。 我们没有任何名为/ Frameworks或../Frameworks的文件夹。 为什么要在其中寻找Swift标准库? 因为它是为iOS和Mac应用程序构建的。 这是Mac应用程序中的目录结构: 那解释了path @executable_path/../Frameworks 对于iOS,应用程序内部的目录结构为: 这说明了path @loader_path/Frameworks (offset 12) 但是,谦虚的命令行工具开发人员呢? Swift标准库在我们的可执行文件中静态链接,但是我们的第三方框架找不到它们。 不幸的是,它们并没有存储在每台Mac上的标准位置。 开发人员可以访问埋在Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx […]

为什么viewWillAppear没有被调用?

您为什么期望如此? 最有可能的是-您想知道您的用户将要看到一个屏幕。 有各种各样有用的理由想要这个。 也许您想跟踪分析屏幕视图,或触发数据获取以保持屏幕新鲜。 无论您的目标是什么,有人都可能告诉您检查viewWillAppear -好消息。 它会实现这些目标,但有时会起作用。 * 简单答案 调用viewWillAppear的技术原因很简单。 通知视图控制器其视图将被添加到视图层次结构中。 它不能是任何视图层次结构-它必须是在根目录下具有UIWindow视图层次结构(不一定是可见窗口)。 如果您从一个选项卡跳到另一个选项卡,或者从UINavigationController推送并弹出,那很好。 iOS正在从视图层次结构中删除视图,并每次都将其重新插入。 在所有这些过程中,视图仍保留在内存中,因此不会重复调用viewDidLoad 。 但是,当您开始在当前屏幕上显示视图时会遇到麻烦,因为有时*它将删除基础视图,但有时*不会。 展示您的View Controller 这完全取决于您如何呈现模态视图。 如果可能的话,iOS倾向于删除基础视图(内存很宝贵)。 但是,如果您的设计师坚持要保留该基本视图,则可以要求iOS通过设置正确的.modalPresentationStyle来保留它。 您可以选择以下选项,以及关闭后是否在其父视图上触发viewWillAppear : UIModalPresentationStyle选择 .none的文档说…… “不要使用这种样式来呈现视图控制器。” 他们通过崩溃强制执行此操作。 感谢Apple让我们保持警惕! 备用计划 当下面的视图保留时,关闭叠加视图时将不会调用viewWillAppear 。 要开展业务,您必须在dismiss呼叫中加入完成处理程序。 将引用传递给呈现的视图控制器的最佳方法是什么? 这确实取决于您如何设置应用程序,这超出了本文的范围。 缺失的环节 当我们将视图添加到窗口的视图层次结构时,iOS如何知道要通知哪个UIViewController ? 从UIViewController文档中,我们可以看到它具有对其拥有的view的引用,但是UIView文档中没有任何内容表明它知道哪个UIViewController拥有它。 这些present方法也没有什么特别的事情发生-即使直接添加视图, viewWillAppear调用也会发生。 仅仅因为苹果不告诉我们发生了什么,并不意味着我们就无法做出有根据的猜测。 让我们偷偷摸摸,检查专用API… 查看所有这些额外的属性! 而且只有一种具有我们要寻找的类型…… UIViewController* _viewDelegate; 让我们通过创建2个视图控制器进行测试。 我们将一个注入到另一个view的_viewDelegate中,并将该view添加到窗口的视图层次结构中时,应调用注入的视图控制器的viewWillAppear 。 自己尝试一下! 警告 —请勿使用私有API交付应用程序。 这是一种危险的编码方式。 这些属性是私有的,Apple保留在不通知您的情况下随时更改其基础实现的权利。 […]