考虑应用中的错误处理系统可以成倍提高应用的可靠性和可维护性。 在您的应用中可能发生错误的无限可能中,您实际上只想看到有限的几种情况。 因此,当出现讨厌的错误或在您的应用中引入功能更改时,您会很高兴您拥有一个了不起的错误处理系统,它将准确告诉您哪里出了问题以及出了什么问题。 如果您有时间,以与Web API相似的方式为它们提供修复建议或提供其他提示也是一个好主意。 我将在为企业解决方案制作iOS应用程序的上下文中解释每个概念。 全文中包含特定的代码要点。 业务视角 在调试和拥有可靠软件的基础上。 企业通常希望收集有关可用性的数据并进行分析以改善其服务和产品。 因此,分析报告中的报告错误统计信息将是其产品如何为人们服务的有力指标。 用户角度 用户不希望应用程序崩溃或不响应。 用户想知道出了什么问题,以便对于大多数错误,他们可以尝试对自己进行故障排除,以便他们可以完成当前的任务。 开发人员观点 开发人员将节省构建和维护系统的时间和压力。 开发人员忘记了他们的代码,开发人员团队将处理彼此的代码; 因此,带有好名字,消息和提示的错误处理系统将使使用您代码的任何人都更加容易。 就像蛋糕一样,应用程序中的所有图层都赋予了它结构。 与蛋糕不同,应用程序中的图层只是抽象的。 模型层 这是业务逻辑所在的位置。 在您要解决的业务问题中,允许哪些关系以及什么才有意义。 因此,将在此处模拟诸如允许每个用户获得多少张优惠券的事情。 与业务相关的数据和模型在此处。 基础设施层 您的应用程序将连接到外部服务,例如第三方API和应用程序自己的后端。 以及本地数据库; 用于缓存和存储内容的服务被视为外部服务。 因此,您的网络和缓存类都在这一层。 诸如请求和响应模型之类的解析和补充模型也在此处。 用户界面层 该层将具有诸如ViewController,View和Cell类的内容。 这是锦上添花。 使它看起来不错。 自从制作了这张图。 我意识到那时就可以处理错误,并且在实践中大多数时候都更好。 模型层 您可能会收到诸如“不允许执行此操作”,“不符合要求的条件”之类的错误。 从编程的角度来看,这些可能是我们认为是业务逻辑的自定义规则。 如果有不同类型的用户和授权类型,将在此处确定。 对于开发人员和用户,这些错误通常可能是相同的。 基础设施层 在这里,您可能会遇到诸如“无法访问服务器”,“文件不存在”之类的错误。 从编程的角度来看,这些通常是从API或数据库传播的错误。 如果错误是技术笨拙的,则最好为开发人员和用户单独发送一条消息。 此外,向开发人员提供尽可能多的信息。 用户界面层 在这里,您可能会遇到诸如“无法调整窗口大小”,“视图未加载”之类的错误。 这些将只是UI错误,因此除非对用户而言至关重要。 无需将其显示给用户。 但是,对于开发人员而言,了解这些至关重要,以便它们可以从中恢复。 开发中 作为开发人员或项目经理。 您应该确保正确执行此部分,以避免在可能避免的事情上花费大量时间。 […]
如何通过发送TableView / CollectionView数据源函数来简化UIViewControllers。 我非常喜欢小型UIViewControllers。 我总是尝试寻找使我的ViewController尽可能精简的不同方法。 使ViewController变大的主要可能性之一是在View Controller中拧紧UITableView或UICollectionView数据源函数。 首先,了解视图控制器需要在表视图或集合视图中显示哪些数据是必需的。 绝对不需要。 相反,如果视图控制器仅将该工作交给另一个对象,情况将会如何。 这个对象负责有关表视图/集合视图的所有事情。 让我们用一些基本的例子来研究它。 感谢您阅读这个故事。 希望您喜欢这篇文章。 快乐编码!
我搜索了React Native的转弯导航,我能得到的最好的是:https://github.com/flyandi/react-native-maps-navigation。 我会说这是一个好的开始。 但是作者说: 请注意,此模块可用,但仍在大量开发中。 某些属性和/或组件名称可能会更改,恕不另行通知。 我不是一直都在更改代码,所以我决定采用更稳定/经过测试的解决方案。 即:MapBox 本教程的实施非常简单,只要您按照以下步骤操作,就应该能够进行逐步导航。 PS:我得到的反馈是,如果您已经在使用Mapbox React Native库,则以下步骤将不起作用。 如果您有解决方法,请告诉我,以便我可以链接到您的文章/库… 为了简短起见,我将跳过这一部分,我假设任何尝试实现这种高级功能的人都可以使用Google“ Setup React Native”。 设置好环境后,我们需要创建我们的项目(我的第一个项目)并导入必要的Pod: 反应性初始TbtNavigation cd TbtNavigation npm install-保存 cd ios / 荚初始化 执行Pod初始化将为您创建一个Podfile,您可以使用自己喜欢的文本编辑器编辑此文件以添加必要的Pod。 如果您不喜欢cocoapods,则必须先进行设置。 您可以在这里找到操作方法。 打开您的Podfile并添加以下行: pod’MapboxNavigation’,’〜> 0.22.0′ 您的文件现在应如下所示: #取消注释下一行以定义项目的全局平台 #platform:ios,’9.0′ 目标’TbtNavigation’做 #如果您不使用Swift并且不想使用动态框架,请注释下一行 use_frameworks!#TbtNavigation的窗格 pod’MapboxNavigation’,’〜> 0.22.0’target’TbtNavigationTests’做 继承! :search_paths #测试豆荚 endendtarget’TbtNavigation-tvOS’做 #如果您使用的是Swift或想使用动态框架,请取消注释下一行 #use_frameworks!#TbtNavigation-tvOStarget’TbtNavigation-tvOSTests’的容器 继承! :search_paths #测试豆荚 结束# 确保use_frameworks! 行未注释掉,然后运行: 吊舱安装 这将设置您并确保您拥有此示例所需的一切。 […]
注意:该项目的源代码可以在Github上找到。 iPhone三年来一直在为Apple Pay配备NFC(近场通信)阅读器,而开发人员一直在耐心地等待访问该小芯片。 随着今年秋天iOS 11的发布,Apple终于向开发人员提供了这一急需的功能。 幸运的是,我们不必等待三个月就可以开始玩了! iOS 11的新框架之一是CoreNFC ,实际上设置起来非常简单! 注意: CoreNFC仅在iPhone 7或iPhone 7 Plus上受支持,即使其他iPhone内装有NFC芯片也是如此。 证书,标识符和配置文件 为了使用具有NFC Tag Reading功能的应用程序,您需要在Apple的证书,标识符和配置文件网页上注册应用程序ID。 前往该处,然后在“ Identifiers标题下选择“ App IDs ”。 继续并添加一个iOS应用ID,该ID与您在Xcode中使用的绑定ID相同。 您可以根据需要命名描述。 在“ App Services部分中,选择“ NFC Tag Reading ,然后单击“继续”。 完成添加新的App ID,然后回到Xcode开始! 无论您是否将此应用程序发布到App Store,都需要执行此步骤,所以请不要跳过它! 入门 就我而言,我将创建一个名为TestingCoreNFC的新项目。 创建一个新的Single View App,并根据需要命名。 我正在为此项目使用Swift,并跳过了单元测试。 继续保存到任何地方,让我们开始吧。 权益 在Project Editor选择“ Capabilities 。 打开其中任何一个,然后再将其关闭。 为什么? 因为这是将权利文件添加到您的应用程序的最简单方法。 在我的情况下,它称为TestingCoreNFC.entitlements 。 在您的权利文件中,添加一个键为com.apple.developer.nfc.readersession.formats的数组。 在数组内部添加一个值为NDEF的字符串。 […]
Rethrows是您在Swift中很少遇到的关键字之一。 在本文中,我们将尝试以一种简单的方式来解释它,而无需太多文献😉 我们将Rethrows用于可能会或不会引发错误的方法(取决于其功能参数) 在拥有Rethrows关键字(Swift 2)之前,我们必须复制函数“ doSomething”以支持两种情况。 那就是所有的朋友。 感谢您阅读并继续编写良好的代码👍
我真的很喜欢Swift中具有关联值的枚举,这是我设计状态的主要工具。 为什么枚举有如此强大而美丽的选择? 主要是因为它们使我可以对类型系统中的数据保持强大的不变性。 例如,如果我有一个屏幕来显示从服务器加载的一些数据,则可以用下一个模型来表示它: struct MyScreenModel { let isLoaded:布尔 let isEmpty:布尔 让数据:SomeInfo? 让错误:错误? } 然后,我可以编写单元测试来检查该模型的正确性,并添加带有预期组合标志和可选参数的文档。 另一方面,我可以用一个枚举来表示它: 列举MyScreenModel { 空的情况 装箱 案例数据(SomeInfo) 大小写失败(错误) } 现在,我的类型反映了我在数据上拥有的所有不变量。 这意味着编译器将能够对其进行检查,并且我可以删除负责验证这些不变量的单元测试。 优点清晰明了,缺点呢? 我们将为这种担保支付什么? 让我们比较一下使用这些类型中的每种类型有多么容易: func viewWillLayoutSubviews(){ self.loadingIndicator.isHidden = self.model.isLoading ==否 … } 与我们以前的版本相比: func viewWillLayoutSubviews(){ self.loadingIndicator.isHidden = { 警卫队.loading = self.model else {返回true} 返回假 }() … } 显然,正在发生坏事。 我们失去了引用模型特定部分的能力,现在我们不得不仔细检查该模型中究竟存储了什么。 编辑使情况变得更糟。 让我们将SomeInfo结构声明为可变的,看看它如何影响我们的代码: […]
最初在这里发布在XCBlog上 苹果的世界开发者大会(WWDC)2018已于本周开始。 按照承诺,随着WWDC内容的宣布,我将撰写一系列博客文章。 关于iOS12,watchOS5等新软件的公告很多。但是,还有另一场平台联盟国会议,这是致力于Apple平台开发人员的主题演讲。 Apple宣布了Xcode 10,其中包含了许多新功能,并且在会议中进行了演示。 在本文中,我们将使用macOS高级版Sierra快速探索Xcode 10的新功能,因为macOS Mojave尚未公开,因此我们不会看到Xcode的暗模式。 Xcode 10具有许多功能,这些功能已在WWDC的平台状态国会议上宣布。 在这篇文章中,我们将仅介绍以下功能。 并行测试:XCTest和XCUITest XCODEBUILD 代码段 方案编辑 多行编辑 新建系统 源代码控制 我们将简要研究Xcode的那些功能。 并行测试:XCTest和XCUITest 苹果实际上在去年WWDC17上宣布了并行测试功能,我们可以在其中指定多个目标,并且测试将相应地在不同的模拟器或设备上触发。 您可以在这里阅读有关去年宣布的XCTest功能的更多信息。 但是,今年它通过创建仿真器的克隆扩展到在单个仿真器中并行化测试套件。 Xcode在后台创建了不同的运行程序流程,每个流程都分配了特定的测试。 这大大减少了测试执行。 我们可以通过更新方案来启用并行测试,并且在“测试”操作中,可以针对测试包选择“选项”以选择并行化选项。 我们也可以选择位置。 还有其他一些选项可以使测试随机化,并可以在方案中添加新测试。 让我们首先关注并行化。 选中此复选框后,我们都准备针对该方案并行执行测试。 默认情况下,只分配了两个运行器进程,但是从命令行运行时,我们可以增加数量。 在Xcode测试报告中,哪个模拟器克隆运行哪些测试。 测试报告分组在一起。 实际上,这是对测试执行速度的极大改进。 使用并行测试技术,我们可以大大加快单元测试和UI测试的速度。 使用这种技术,我们仍然应该能够在多个模拟器目标位置执行测试。 并行运行XCTest的各种选项已添加到xcodebuild工具中,我们将在本文的以下部分中进行探讨。 XCODEBUILD Xcode 10附带了各种命令行工具,这些工具可以帮助从命令行或脚本中实现各种功能。 这是为各种目的添加到xcodebuild中的一些新选项。 平行测试 可以使用xcodebuild工具从命令行运行XCTest。 使用Xcode 10,我们还有其他一些选项可以启用并行测试,这些是 -maximum-concurrent-test-device-destinations NUMBER:要同时测试的最大设备目标数 -maximum-concurrent-test-simulator-destinations NUMBER:要同时测试的模拟器目标的最大数量 -parallel-testing-enabled YES | NO:覆盖方案中的每个目标设置 -parallel-testing-worker-count […]
วิธีเปิดใช้นก่อนเขียนวิธีเปิดใช้Touch Bar Simulatorเพื่อที่จะได้ลองเล่นสัมผัสแห่งอัจฉริยะ Touchองเล่น触摸栏模拟器บนXcode 全新Macbook Pro触摸屏ซึ่งมันMacาอยู่แทนที่ปุ่มฟังก์ชั่นทั้… medium.com BarาAPIนนั้นก็ใช้เวลาทั้งในงมอยู่กับTouch Bar APIและ示例代码ที่แอปเปิลปล่อยมาให้—控制器สวยงามบลาๆแต่เหมือนจะมีปัญหา กับตัว触摸栏API Sim模拟模拟器ที่ทำให้ที่เขีไหกดไหกดกดงRedแล้วมัแล้วมัแล้วมัแล้วมัแล้วมัแล้วมัแล้วมัื่กมื่ไม่เคstartื่ื่ื่ื่ โผล่มาอีกให้ความรู้สึก แบบอนแบบ“เหี้ยมันทำงานได้ไงวะ”กับ“เหี้ยทำไมทำงานไม่ได้วะ”ในเวลาเดียวกัน Barากนั้นเราสร้างTouchBarที่ไหน? AppนAppDelegateเลยได้มั้ย? จริงๆก็ได้นะแต่ในเอกสารบอกว่า “将栏与您的应用程序对象而不是与应用程序委托关联,或与窗口控制器对象而不是与窗口本身关联……” – https://developer.apple.com/reference/appkit/nstouchbar 应用商店WindowController应用商店(AppDelegate)—应用商店WindowController应用商店NSWindowController เปิดากนั้นเปิดMain.storyboardแล้วเปลี่ยนWindowให้เป็นWindowControllerที่เราสร้างซะ ที่าที่Controller WindowController.swift —ิ่มจริ่มจากTouchBarตัวละตัวต้องมีIDเป็นของตัวเองและTouchBarItemแต่ละตัวก็ต้องมีองเช่นกันเพราะงั้นผมจะเริ่มสร้างIdentifierสำหรับTouchBarและTouchBarItemก่อนโดยใส่ไว้เป็น扩展使用NSTouchBarCustomizationIdentifier,使用NSTouchBarItemIdentifier(示例代码นั้นแหละ) 窗口栏 เป็น标识符ของTouchBarแต่ละตัวครับเนื่องจากในระบบมีหลายTouchBarและในแอพฯก็อาจหลายTouchBarด้วย 标签 ในที่นี้เป็น标识符ที่จะไว้แสดง您好,TouchBarนั้นเอง งางนั้นก็มาเขียนฟังก์ชั่นสำหรับสร้างTouchBar customificationIdentifier — TouchBar标识符ที่เราสร้างก่อนหน้านี้ defaultItemIdentifier —数组数组NSItemTouchBarIdentifier数组TouchBar数组Item .label 标识符标识符标识符标识符TouchBarItem标识符标识符TouchBarItem代理标识符代理 กผมใส่นื่องจากผมใส่自我ให้เป็น代表เลยdelegateองเขียนฟังก์ชั่นตาม协议มNSTouchBarDelegateดังนี้ 等级TouchBarItemงนleaน้าที่ของ แล้วริงๆแล้วTouchBar APIมีNSTouchBar子类มาให้ใช้หลายอันแต่ปัญหาคือมันไม่มีอันไหนที่ไว้สำหรับสร้างLabelง่ายๆยเลอต้ร้างCustom Itemแล้วใส่Labelไปเป็นViewของมันแทน(ถ้าทำในInterface Builderมีให้นะนเป็นCustom ใส่标签เหมือนกัน) ับรับTouchBarItem NSางๆที่แอปเปิลมีให้ดูได้ในเอกสารตรง หัวข้อNSTouchBarItem子类 Barรงนี้สั่งรันแอพขอพขราแล้วเปิดTouchBar Simulatorขึ้นมาก็จะได้您好,TouchBarสีเขียวๆขึ้นมาแล้วTADA! —วิธีเปิดTouchBar模拟器คือcmd + shift + 5
最近,我开始从事一个新的个人项目,在该项目中,我对整个应用程序具有静态背景,而我所有视图控制器的视图都具有透明背景。 默认的过渡动画与源视图和目标视图有一点重叠,因此,只有一种方法可以使我们的应用程序具有一定的尊严和平滑度-是的-这是自定义动画过渡,并且由于我们通常想保持滑动手势来回手势在视图控制器上,我们还必须创建自定义的交互式过渡。 样例项目 我创建了一个示例项目-您可以在GitHub上找到它。 让我们开始理论 我们要做的第一件事是为UINavigationController实现自定义过渡,并实现其委托方法
1:嘿Aivars,感谢您抽出 宝贵 时间参加 #10QwithDVLP 。 您目前的职务是什么? ->我是一名独立的iOS开发人员。 作为自由职业者,还可以构建自己的应用程序。 2:您何时决定要成为计算机程序员? ->大约15年前决定开始学习计算机科学并从事IT工作。 在软件开发公司从事产品管理工作大约10年,但最终决定大约5年前,我自己想与软件开发和编程应用程序紧密合作。 3:您最喜欢的编程语言是什么?为什么? -> Swift是我当前的最爱。 主要是因为这是我喜欢做的方式,因此请为iOS创建应用程序。 我更喜欢C,C ++或目标C之前学过的东西,因为它更清晰并且具有不错的现代功能。 代表,闭幕等 4:您现在对职业的了解是什么,而您刚开始职业时并不知道? ->我从事软件开发行业大约15年。 do已经不记得我之前不知道的了 我猜这是通信和网络。 不知道这比您的技术技能更重要。 5:到目前为止,您职业生涯中最大的挑战是什么? ->从全职工作转到独立的自由职业者载体。 我仍然全职工作并开始发展自由职业的时期非常具有挑战性。 6:作为计算机程序员,最困难的是什么? ->就像魔术。 您可以从零开始创建事物-应用程序,软件产品。 仅凭您的想象力和头脑。 我喜欢编程的创造力。 7:您对打算成为程序员的年轻学生有什么建议? ->要保持一致和专注。 现在几乎有太多可用信息。 我经常被问到什么是最好的学习课程或书。 学习基础知识,坚持自己的选择,并开始致力于自己的想法。 8:有些学生认为他们可以自己在线学习编程,不需要任何大学课程或训练营。 你怎么看? 开发人员真的需要大学学位吗? ->新兵训练营和大学为学习提供了一个结构。 自我学习是可能的,但更具挑战性,因为学生应该选择学习的内容和顺序。 在另一方面。 我拥有CS学位,但自己学习过iOS开发。 对于今天的工作,自学+在软件开发中担任产品经理比在CS中获得学位更有用。 9:2018年在人工智能方面大肆宣传。 您对AI有何看法? 这是当今学生应该关注的唯一课程。 -> IT和软件开发中总是有新事物。 我相信AI和机器学习的前途一片光明,但您始终应该睁大眼睛,准备学习新事物。 10:将来,由于AI,只有程序员和工程师才能找到工作。 ->很难说,如果我们不定义未来。 50年前,当今的技术看起来像魔术。 但是我仍然会在我的一生中看到这一点。 谢谢你的时间。 […]