iOSDCにて,発表しました🎉 iOSDCのスタッフの方に,良い写真をたくさん取っていただけました😋 iOSDC日本2016 iOSDC日本2016の公式フォトアルバムです www.flickr.com
SOLID原则是5个OOP设计原则,可帮助您使软件更加灵活,可读性和可维护性。 在这个由五部分组成的系列文章中,我将介绍其中的每一个,并通过示例介绍其中的每一个如何为您提供帮助。 S —单一责任原则(或简称为SRP) 一个模块应该只有一个责任,只有一个改变的理由。 O —打开/关闭原理(OCP) 应该打开一个模块进行扩展,但关闭该模块进行修改。 L — Liskov替换原理(LSP) 程序中的对象应该可以用其子类型的实例替换,而不会改变该程序的正确性。 I —接口隔离原理(ISP) 许多特定于客户端的接口比一个通用接口要好。 D-依赖倒置原则(DIP) 一个人应该“依靠抽象而不是凝结。” 在第一部分中,我将介绍第一个原理SRP。 我认为,这是iOS开发中最重要的5个。 “一个模块应该只有一个责任,只有一个改变的理由。” 从本质上讲,这意味着代码中的对象,类型,类或任何其他模块应负单一责任,这也是更改的唯一理由。 为了说明这一点,假设您有一个应用程序,用户可以在其中设置个人资料图片。 该图像仅显示给用户,因此可以将其存储在磁盘上。 没有SRP,用于编辑个人资料图片的视图控制器将如下所示: 它不在乎也不应该在意如何将食物带到餐桌上。 唯一的责任就是吃它。 他不需要知道您换了工作,升职或被解雇了。 他根本不在乎您如何工作,只要您将他需要的食物带给他即可。 —唯一要担心的是。 我们的下一步将是分离关注点。 就像上面的猫一样,我们的视图控制器不需要知道默认的配置文件资产名称,也不需要知道如何保存它或保存在哪里。 唯一的责任是在UIImageView上显示UIImage。 现在,我们需要一个将处理所有个人资料图片加载和保存的类。 我们可能最终会得到这样的结果: 因此,视图控制器现在看起来像这样: 如我们所见,将个人资料图片管理与视图控制器分离,可以为我们提供更高的可读性和灵活性。 首先,该类现在可以在其他视图控制器中使用,因为我们将个人资料图片管理职责分离到了另一个模块。 现在也阅读视图控制器会更好。 我们只需将图像从ProfilePicManager加载到将在完成时调用的闭包上,然后显示图像。 认为这种方法比第一种更好,但仍不是SRP。 因为如果我们需要保存的图像不是个人资料图片,还会存储更多图像吗? 在前面的示例中,我们将个人资料图片管理与视图控制器分开。 但是我们的ProfilePicManager没有单一职责。 目前它有两件事: 个人资料图片管理 从存储层获取数据(在这种情况下为文件系统) 从中获取图像或保存图像的方式不是ProfilePicManager的责任或责任。 唯一的工作是从存储层获取个人资料图片,并在用户选择图片时将其交给存储层。 一个模块应该只有一个责任,只有一个改变的理由 。 如果确实要仅更改存储层(例如,从文件系统存储更改为远程服务器存储),而这与ProfilePicManager无关,则也必须更改它。 那不是我们想要的。 在这种情况下,使用SRP,我们只想更改存储层模块。 为了实现这一点,我们将不得不再创建一个类来处理与存储层的通信-ImageStorage 。 […]
每当我想进行一些快速脚本编写(例如创建大量随机测试用例以测试某些python程序)时, perl通常是我选择的语言。 当然,几天后很难理解,但是对于快速又脏的东西,它的工作非常出色。 主要优点之一是,从perl运行shell命令非常简单:您只需在反斜杠中写一些东西: `echo“ foo”` 例如,这使我很容易在计算出要使用的测试输入后调用适当的python脚本,然后在过程完成后验证输出。 为了将脚本编写过程切换到Swift,我想知道是否有可能这样做。 事实证明,在Foundation中有一个名为Process的类可以做到这一点。 但是,像大多数基础课程一样,它非常灵活,这也意味着有很多样板要进行。 这是我尝试将其转换为简单的函数调用。 首先,我在Google上搜索了一些使用Process类的代码片段,这样我就可以获得一种初步的方法。 事实证明,我还需要使用Pipe类来捕获输出。 真正困扰我的是,我正在尝试测试的程序需要从stdin读取其输入。 我想给它提供一个普通的字符串(而不是编写它来读取一个文件,这似乎太麻烦了),但是我找不到用Pipe做到这一点的方法-官方文档使我在其他方面进展顺利但这使我失败了。 然后,解决方案:将输入内容写入临时文件,使用该文件作为输入来运行该过程,然后删除该文件。 笨拙,有点太笨拙了,但是我知道了。 考虑到我以为刚开始时这甚至是不可能的,因此产生的功能出奇地好。 我只是用它们来创建一些测试功能并成功地对一些作业进行评分。 最终代码在下面的要点中:
尊敬的所有iOS开发者和读者, 我的这篇文章将尝试向您介绍Swift语言在扩展方面的功能。 对于新手, 扩展为现有的类,结构,枚举或协议类型添加了新功能。 苹果 尽管在Objective-C中也可以使用扩展/类别。 但是Swift在这方面已经赋予了更多权力。 因为在Swift中,我们也可以创建原始数据类型的扩展,例如Int,Float Double。 所以我在说什么很棒的扩展。 我们一直在使用NSLog或Print来打印变量的值以进行调试。 print(“Trying to print \(someVar)”) 另外,我们可以从Xcode控制台使用po命令来查看变量的值。 我们也可以将p和fr v用于相同的目的,请阅读更多。 丑事: 我发现丑陋的是在变量前写了NSLog(“或print( ,在变量后写了”) 。这有点使我的Raftaar在编写代码时遇到了麻烦 。 因此,如果我们只将po()放在变量后,那会不会更聪明 。 喜欢 someVar.po() ,它将打印在控制台上, 代替 NSLog(“%@”,someVar) or print(“Trying to print \(somevar)”) 那就是我们今天要做的。 好吧,这里的主要目标是能够在任何类型的变量上调用po() 。 当我尝试创建扩展时,我正在考虑使用AnyObject创建on。 但是幸运的是我们无法在AnyObject上创建扩展。 经过一番研究后,我意识到所有非原始类型iOS框架的基类都是NSObject 。 所以这是价值十亿美元的扩展extension 扩展NSObject { func po() { 打印(个体经营) } } 现在,只需在String , Array , […]
Boost.Asio是Cocos2D-X中最受欢迎的网络框架。 然后,我决定制作一个名为“ lib_boost_asio”的外部预构建库,该库仅支持Boost.Asio。 它 包括5个用于Boost.Asio的库,以使其体积较小: “ chrono,system,thread,date_time,regex”。 如果您需要其他增强功能,也可以自己添加。 你需要什么? lib_boost_asio.zip 它具有Boost 1.63.0的头文件夹以及针对Win32(32bit-debug),Android(arm,arm-v7a,x86-release),iOS(arm64,armv7,i386,x86_64 -release)的预构建库 注意:在iOS预先构建的库中,我将5个支持所有架构的库编译为名称为“ lib_boost_asio.a”的fat lib。 链接:https://www.dropbox.com/s/nzn4ma7l9l6xe8y/lib_boost_asio.zip 我也有小型测试项目cocos2dx。 如果需要,可以下载: 链接:https://www.dropbox.com/s/tlalc7h68p07v2n/Boost_Asio_CC2DX.rar 如何添加到项目cocos2d-x 3.x? 解压缩文件夹“ lib_boost_asio”并将其复制到路径{ROOT_PROJECT} \ cocos2d \ external 现在,我们将为所需的每个项目进行配置:Win32 / Android / iOS
KVO-这种机制的主要目的是观察对象变量或属性的变化。 当您尝试回答以下问题时,您会更容易理解:“您如何知道某个类的某些属性或任何变量已更改?”。 在iOS中,我们有一种使用KVO实现此目的的简单方法。 一个对象首先注册以观察另一个对象的属性。 然后,只要该对象的该属性更改其值,就会自动向观察者通知更新的更改。 它是如何工作的 ? 每当银行帐户余额发生变化时,您在手机上收到的更新就是KVO通知的示例。 由于我们已在银行注册以接收余额更改通知,因此只要发生更改事件,银行都会通知我们。 因此,我们采取了必要的行动。 KVO在Swift中不是很好,因为它必须依赖于Objective-C运行时—您需要对从NSObject继承的类使用@objc关键字,然后使用@objc dynamic标记每个属性。 让我们来看一个例子。 我们可以简单地发布这样的通知:
如何定期从网络下载内容? iOS有哪些背景模式可用? 当用户没有积极使用您的应用程序时,系统会将其移至后台状态。 对于许多应用程序而言,后台状态只是暂停应用程序的短暂停留。 挂起应用程序是延长电池寿命的一种方式,它还允许系统将重要的系统资源投入到引起用户注意的新的前台应用程序中。 需要在后台运行以支持特定类型任务的应用可以声明其对一种或多种后台执行模式的支持。 了解有关Apple Developer的更多信息。 在这里您可以了解所有背景模式。 我们将在该文章中讨论bg提取。 该应用程序会定期从网络下载并处理少量内容。 要支持此模式,请从Xcode项目中“功能”选项卡的“背景模式”部分启用“背景获取”选项。 (您也可以通过在应用程序的Info.plist文件中将UIBackgroundModes值包含UIBackgroundModes键来启用此支持。)启用此模式并不能保证系统会给您的应用程序任何时间执行后台获取。 系统必须在您的应用程序获取内容的需求与其他应用程序以及系统本身的需求之间取得平衡。 在评估了这些信息之后,系统会在有很多机会的时候为应用提供时间。 当有好的机会出现时,系统会在后台唤醒或启动您的应用程序,然后调用应用程序委托的application:performFetchWithCompletionHandler:方法。 创建一个新的Single View App项目。 热键:shift + Command + N 添加后台模式功能 选择项目 开放目标的能力 激活背景模式 检查背景提取 打开AppDelegate.swift文件。 修改文件中的代码。 查看控制台输出。 数据在这里! performFetchWithCompletionHandler结果:可选(“ \ n <html xmlns = \”http://www.w3.org/1999…………。 是的 我们有数据。 有什么用呢? 这是你的选择。 设置申请方案 开放方案设置 打开选项标签 检查背景提取 在模拟器上运行。 是的 现在应用程序尚未启动,并且后台获取模拟已经启动。 你完成了! 拍! 拍! 请记住,成功的秘诀是不断学习和与同事沟通,包括自我教育。 […]
设置设备进行网络调试 调试通过WiFi或其他网络连接在iOS或tvOS设备上运行的应用。 注意:网络调试需要在MacOS 10.12.4或更高 版本上运行的Xcode 9.0或更高 版本 ,并且在设备上需要iOS 11.0或更高版本或tvOS 11.0或更高版本 。 设置iPhone,iPad或iPod touch的步骤 1.选择“窗口”>“设备和模拟器”,然后在出现的窗口中,单击“设备”。 2.使用避雷线将设备连接到Mac。 3.在左列中,选择设备,然后在详细信息区域中,选择“通过网络连接”。 Xcode与您的设备配对。 如果Xcode可以使用网络与设备连接,则在左列中设备旁边会出现一个网络图标。 4.断开设备连接。 现在您可以通过网络进行调试了。 注意:MAC系统和iPhone / iPad应该共享同一网络才能使用无线调试。 资源:https://stackoverflow.com/a/44383502/4935811
Bilgipaylaşımdenemeleri。 她的hafta tek doz Geçtiğimizhafta试试! log()Ilkayınıdoldurdu。 女孩yazıdakoyduğumhedefe istinadenuzun-kısademeden她的ftyazıyazmayaçalıştım。 布农拉(Bununla birlikte)她的女儿说她的艺术。 Buyazılarıgörüpbanaulaşanlar,soru soranlarolmasıbeniçokmutlu ediyor。 乌马姆·赫克斯(Umarımherkes)饰演faydalıoluyordur。 İstediğinizzaman banaulaşabilirsiniz🙂 Buhaftanınolayı,Swift ile Android凝胶yapılançalışmalar喀布尔edilip,合并edildi。 Google的Swiftüzerineplanlarıolabilir-söylentisiişlerideğiştirebilir。 通过modocache移植到Android·拉取请求#1442·apple / swift 此请求请求中有什么? 这将为stdlib添加一个Android目标。 这也是交叉的第一个例子 。github.com İlkiTokyo’dadüzenlenen尝试使用Swiftkonferansınınikincisi geliyor。 @NatashaTheRobot联合国组织了纽约州立大学的会议。 tryswiftnyc.com确认erken biletlereulaşabilirsiniz。 (Siztıklamadansöyleyeyimbiletler 600 $ danbaşlıyor😳)Konuşmacılarınkalitesinebakılırsafiyat / performans olarak normal denilebilir。 İlkkonferansınvideolarınınbirkısmınıburada尝试! 斯威夫特·迪耶·阿拉塔拉克·布拉比利尼兹。 (Maalesef kategoriözelliğiyok。)Örnekvideolar bu,bu ve bu… 埃里卡·萨顿(Erica Sadun)未婚妻默认情况下,她的未婚夫为她的未婚夫(serferindeyazmanıngereksizolduğunusavunmuş)。 Swift’in default sistemini kullanarakbunlarıdaha kolay […]
持续集成的最好部分是能够自动运行测试并构建可部署的应用程序。 但是,自动构建并不意味着智能或优化的构建。 这是我在加快交付过程中收集的一些技巧。 在进行改进之前先进行测量,然后进行全新清洁大约需要6分钟。 在持续集成方面,我在服务器上使用Fastlane,这大约需要30分钟。 这些通道包括清理,运行测试,然后构建并最终部署到Fabric。 让我们看看如何改善这些时间,一次解决一个问题。 代码优化 代码表达式越复杂,编译器花费在编译器上的时间就越长。 以下是应避免的示例: return CGSize(width: size.width + (rightView?.bounds.width ?? 0) + (leftView?.bounds.width ?? 0) + 22, height: bounds.height) 为了找出应用程序的哪一部分需要花费大量时间来编译,开发人员将构建时间分析器组合在一起。 借助此工具,您可以快速识别和改进代码,从而快速赢得构建时间。 您还可以在Xcode本身中创建特定的警告来标记需要花费太多时间编译的代码。 项目优化 首先,我首先删除了我没有注意到的不必要的代码。 我的意思是一段时间后,如果您使用Cocoapods管理库,那么您可能还会拥有不再需要或不再使用的代码。 为此,我使用了pod deintegrate && pod install 。 第一部分将完全从您的项目中删除Cocoapods依赖项,然后第二部分将重新安装它。 这样,我设法删除了数百个未使用的文件,这意味着编译时删除了数千行代码。 加快构建时间的另一种方法是使用快速模块优化。 我绝对建议您查看Apple文档Swift.org-Swift 3中的整体模块优化。 实际上,在项目的“ 构建设置”下的“ Swift编译器”部分中,您可以自定义“ 优化级别” 。 但是,如果您想保持调试应用程序的能力,则不选择“整个模块优化”。 一种变通方法是仍然能够调试您的应用,将其标记保持为-Onone ,但您必须将SWIFT_WHOLE_MODULE_OPTIMIZATION添加为YES作为自定义用户设置。 通过这些更改以及清理项目后,我的构建时间从5’50”转移到3’15”,几乎是一半的时间。 现在让我们看一下持续集成方面。 快速通道优化 我使用Jenkins使用Git flow和Fastlane自动构建和准备新的iOS更新。 […]