Tag: 移动开发

使用IGCStatefulView管理UIView状态

当今大多数(如果不是全部)应用程序都会向其用户显示某种数据,无论是体育应用程序的记分板,新闻应用程序的各种新闻和文章,还是金融应用程序中与股市相关的信息。 这些应用程序希望一直向其用户提供有价值的信息,因此在某些情况下,这些应用程序将无法正常运行,例如网络错误或服务器错误。 然后,应用程序应该能够以某种方式向用户显示这些错误,使用户可以清楚地了解他们尝试查看应用程序中的信息时所发生的情况。 对于移动应用程序开发,表视图有一个特殊的子类别,它可以执行这种数据处理,即有状态表视图 。 这些表视图就其对应的数据集传达了不同的状态。 大多数有状态表视图都围绕以下三个状态: 加载,成功,错误 。 载入中 是当应用程序仍在处理其数据以将其作为数据源馈送到其表视图时。 成功 是指应用程序成功处理了数据后,在此过程中将其显示在表格视图中。 错误 是当应用程序遇到任何可能阻止应用程序获取必要数据的错误(上述示例)时。 现在,您可能想知道如何处理此类情况。 幸运的是,对于我们的iOS开发人员而言,Cocoapods拥有大量的图书馆,可以为我们完成工作。 考虑到这一点,让我们专注于一个库,它不仅显示表视图的状态,而且还显示集合视图和一般视图的状态-IGCStatefulView。 顾名思义 , IGCStatefulView的功能与其他状态表视图库相同,但是它的优点之一是,除了对UITableView实例的支持外,它还可以容纳UICollectionView和UIView 。 其背后的想法是数据的显示不仅限于UITableView实例。 由于它的功能类似于UITableView,因此也可以通过UICollectionView完成。 另外,并非所有数据都以列表形式显示。 例如,假设有一个新闻页面的详细信息页面。 虽然合理,但大多数时候,显示相关信息是通过UIScrollView或UIView完成的。 希望您会发现此库对您的项目有用。 如果您想了解有关IGCStatefulView的更多信息,以及如何将其集成到您自己的项目,使用它或为它做贡献,请检查其GitHub存储库。 干杯! 吉尔斯·兰伯特(Gilles Lambert)摄

Swift中的惰性属性

Swift中的lazy关键字使您可以延迟存储属性的初始化,直到需要它为止。 这种方法的好处是可以提高性能,因为如果不需要立即启动,可以避免启动过程中潜在的昂贵过程。 您可以将初始化视为分配具有初始值的变量。 一个对象可以具有属性,因此当我们初始化它时,它的属性也会被初始化。 定义惰性属性 您可以通过在var关键字前添加lazy来定义lazy属性。 但是,您不能使用常数,因为惰性属性的值仅在初始化后才计算,而常数则需要一个值。 由于使用lazy关键字的目的是将代码执行延迟到初始化之前,因此,简单的自执行闭包是一个完美的用例。 让我们以下面的伪代码 为例 想象一下,我们有一个MathsHelper类,该类可用于计算Pi的值以及其他随机方程的集合。 如果只打算使用它们的一个子集,则无需计算此类中的所有属性。 通过在var前面加上lazy ,可以延迟此操作,直到需要它为止。 这种方法的另一个优点是,我们现在将此属性的声明和设置都放在一个位置。 我可以将计算属性声明为惰性吗? 不。 每次访问计算属性时都会重新计算,但是根据定义,在初始化时,惰性属性仅计算一次 。 这种方法有什么缺点吗? 附加了lazy关键字的var不是线程安全的。 这并不意味着多个线程在尝试访问其值时将创建多个实例,而是如果2个或更多线程尝试同时访问它,则第一个线程之后的任何线程都可能接收到该对象的部分初始化的实例。 在Swift本身中,有一个开放的错误可以解决此问题。 tl:dr? lazy关键字用于延迟变量的初始化 这可以帮助提高性能和启动时间 但是,此行为不是线程安全的

在React Native中处理来自OneSignal的远程推送通知

两周前,我发表了一篇文章,介绍了通过OneSignal为React Native(iOS和Android)设置推送通知所必须采取的每个步骤。 但是帖子在交付时就停止了-如果您想在用户通过推送通知打开应用程序时为他们做些什么呢? 如果他们在应用程序中打开了推送通知怎么办? 这就是我今天打算讲的内容。 在继续本文之前,请确保已为您的平台设置了OneSignal。 访问通知 在我们实际上无法对通知执行任何操作之前,我们需要访问该通知的内容。 使用react-native-onesignal时 我们将利用已打开的事件,我们可以使用OneSignal.addEventListener进行监听 。 确保您也删除了监听器! 现在,我们对数据的外观有了一个了解。 让我们写一些代码。 我们将使用react-native-root-toast 在应用中显示通知。 这是计划: 不活跃的经历 那么,如果用户在我们的应用程序处于后台时单击通知,该怎么办? 我将继续进行,好像我们使用的是react-native-router-flux (我有一个有关如何使用它的教程) 。 因此,回顾我们的规范,我们知道在这种情况下,我们不会向用户显示消息(他们已经从通知中看到了该消息),但是我们确实希望将它们带到适当的房间。 您会看到,访问我们从推送通知传递的自定义数据非常简单,从而为用户提供自定义体验并节省时间。

老派的Objective-C与新星Swift

时钟在滴答滴答,技术不止于此。 我们每天都面临着各种变化,包括编程语言的发展。 在创建Swift之前,Objective-C是IOS开发人员的唯一选择。 但是,随着时间的流逝,开发人员开始抱怨这种语言已成为过去的一种现象。 他们告诉我们,Objective-C是按照现代标准的老式,坦率的丑陋和不便的语言。 当然,每种著名的编程语言都有讨厌者和支持者。 开发人员应有充分的理由拒绝某些编程语言并开始学习新的编程语言。 IT行业的历史知道很多情况,当时间引起确定的变化并导致过渡时。 Swift是新的编程明星 如果您对iOS应用程序的创建感兴趣,则会出现一个问题-选择哪种编程语言:新的Swift或经过时间考验的Objective-C? Swift被定位为一种简单明了的语言。 Objective-C需要相当高的知识和技能。 因此,努力一次完成所有工作的新手开发人员将面临许多困难。 苹果对Swift寄予厚望。 由于具有多个关键功能,因此多年以来,Swift有潜力成为创建灵活软件的唯一首选编程语言。 Swift比Objective-C的优势: Swift比Objective-C的可读性更好。 Objective-C遇到了用C系列语言带来的所有麻烦。 为了区分关键字和C数据类型的类型,Objective-C使用@符号引入了新关键字。 由于Swift不是基于C的,因此它可以组合所有关键字并删除每个Objective-C类型之前或与对象关联的关键字之前的众多字符@。 因此,您无需在行末添加逗号或在括号中添加括号以将条件表达式括在if / else语句中。 另一个大变化是方法调用不位于彼此内部。 在Swift中,方法和函数通过括号中的标准逗号分隔参数列表进行调用。 结果,我们获得了具有简化语法和语法的纯净表达语言。 与Objective-C不同,Swift代码的可读性促进了JavaScript,Java,Python,C#,C ++开发人员的工作。 Swift更安全 指针处理方法是Objective-C中最有趣的时刻之一,尤其是nil(NULL)。 在Objective-C中,如果您尝试使用nil指针(未初始化)变量来调用方法,那么一切都会好起来的。 表达式或代码行变得不可能。 即使有欺骗性的表现,您也会遇到很多错误。 可选类型可以使nil代码中存在可选值。 如果开发人员不好地编写代码,则会出现编译器错误。 这是一种简短的反馈,它使开发人员可以更加自信地编写代码。 Swift需要更少的代码 Swift减少了重复语句和行所需的代码量。 在Objective-C中使用文本字符串时,您必须要罗word。 对于两个信息的组合,您应该通过许多步骤。 在Objective-C中,如果您违反了头寸订单或使用了错误的行标记,则应用程序将崩溃。 同时,Swift减轻了您的工作量:由于内置了对文本字符串和数据处理的支持,因此您可以编写更少的代码(因此,错误更少)。 雨燕更快 由于删除了过时的约定,Swift的引擎变得更好。 对Swift代码性能的测试仍然表明Apple继续提高Swift上应用程序的速度。 根据Primate Labs的说法,GEMM算法表明,Swift编译器无法像C ++编译器那样对代码进行矢量化。 C ++的优势不大,但是Apple承诺会在下一个Swift版本中修复所有问题区域。 Swift具有动态库 动态库是可以附加到应用程序的可执行代码段。 由于其不断发展,该功能允许当前的Swift应用程序联系较新的语言版本。 动态的Swift库使更改和改进变得更加容易和快捷。 现在,人们无需等待IOS发行就可以获得Apple向Swift引入的改进。 […]

蒸气—后端的快捷选择

我决定深入研究Vapor,以及它是否真的是可行的选择。 早在2月份,我播了一段播客,概述了开发移动应用程序时不同的后端选项。 简而言之,当寻找正确的选项时,有很多选择。 例如,对于Swift开发人员而言,Vapor已成为越来越合适的选择。 因此,我决定深入研究Vapor,以及它是否真的是可行的选择。 选择的多样性 纵观后端选择的前景,可能会造成混乱。 最后, 这实际上取决于团队的技能水平 。 例如,如果您使用JavaScript来构建Web和移动应用程序,那么Node.JS就很有意义。 另一方面,如果您是.Net开发人员团队,则Web API很有意义。 此外,如果您特别精​​通PHP,Python,Ruby,Go等…,则应保持自己的舒适度。 但是,对于专注于Apple产品的单个开发人员和开发人员团队(例如我),没有专用于服务器端应用程序的框架。 因此,最接近的选项是CloudKit,它适合于数据存储,但缺少以下选项: Web和Apple设备外不支持 不支持完整备份 锁定到CloudKit数据模型中以建立关系 没有Cron工作 但是,还有其他选项可以在服务器上的Swift中继续开发。 蒸气—服务器快速处理 自Swift于2015年末开源以来,已添加了与其他操作系统的兼容性。 将Swift迁移到服务器的第一批团队之一是Vapor团队。 自2018年5月发布3.0版以来,人们的兴趣日益浓厚。 在本文中,我将回顾Vapor并介绍以下内容: 易于安装和部署 蒸气开发 数据库支持 事件驱动的异步API 因此,让我们从开始变得容易开始。 蒸气入门 在我最近发表的这篇文章中,我展示了如何在Mac和Ubuntu以及Heroku之类的服务上安装Vapor。 简而言之, 我发现该过程非常简单有效 。 也就是说,它没有其他任何Web框架那么复杂。 例如,在Mac上,开发人员可以使用相当普遍的Homebrew来点击Vapor存储库并进行安装。 有权使用Vapor CLI工具后,该工具包括一个子命令,用于使用Vapor buildpack设置Heroku应用程序。 同样在Ubuntu上,您为Vapor添加apt仓库,并通过apt命令安装。 完成此操作后,您可以轻松地使用进程监视器和http服务器的组合来代理服务器。 如果您对此过程的更多细节感兴趣, 请查看这篇文章,深入了解Vapor并设置macOS,Heroku和Ubuntu。 蒸气开发 安装了Vapor之后,该过程的下一部分将开发该应用程序。 因此,IDE非常重要。 带有蒸气的开发人员工具 尽管存在问题,我们仍然可以使用Xcode在Swift中进行开发。 但是,由于有用于构建Swift应用程序的命令行工具,开发人员可以选择自己的工具。 目前,真正的限制是Swift通常仅在macOS和Ubuntu上受支持。 也就是说, 不支持其他Linux或Unix操作系统,也不支持Windows。 但是,社区肯定会在这些领域提供更多支持来向前发展。 […]

iOS的TableViewKullanımı

从iOS发行到iOS发行人。 Ilk olarak故事板üzerindeki视图üzerine表视图ekliyoruz。 Böylebirgörünümelde ettikten管理员üzerineekliyoruz。 Şimdigeldik控制器üzerindekiişlemlere。 选择UITableViewDelegate和UITableViewDataSourcedelegasyonlarımızıekliyoruz。 Eklediğimizbu iki Protokol bizden ikifarklımethodu zorunlu olarakkullanmamızıistiyor。 numberOfRowsInSection和cellForRowAt。 numberOfRowsInSection toplamdakaçadet rowa sahipolacağımızıdöndürürkencellForRowAt表视图Celldöndürüyor。 Yani numberOfRowsInSection方法表视图üzerindekaçadet eleman,hücreolacağınıbelirliyyuz,cellForRowAtüzerindeise表视图hücrelerinidüzenliyor,ayarlıyoruz。 Zaten iki methodundöndürdüğüveri tipinden de anlayabilirsiniz。 Standart olarak UITableViewCell()在Storyboard上的可重复使用的单元格。 Haydiöyleyapalım。 TableViewCelli表视图可以用于UITableViewCell类,还可以用于标识符。 本OrnekCell添加UITableViewCell类。 Ve标识符olarak da ornekCellIdentifieryazdım。 否:不能识别XCode等级的检查员,请立即检查。 Burayıda hallettikten声音控制器üzerindeçalışmaya。 您可以从表视图视图中下载表,也可以从表视图中查看数据源。 UITableViewDelegate和UITableViewDataSource可以在UITableViewDataSource上进行更新。 Dahaaçıkanlaşılmasıaçısındanşöyleyapalım。 Meyvelerdenoluşanbir字符串数组oluşturalım。 Arrayımızşöyleolsun。 让meyveler = [“ elma”,“ armut”,“ muz”,“çilek”,“ kiraz”,“ portakal”,“ mandalina”] Arrayimizioluşturduktan声纳numberOfRowsInSection方法使用elemansayısını(Int)döndürüyoruz。 […]

Swift中的’open’关键字是什么?

如果您是iOS / Swift开发的新手,则可能遇到过open关键字,只是问自己“这是怎么回事?” 了解这个奇怪关键字的用法可能会造成混淆,但是,在本文中,我将尝试介绍一个常见的用例,并希望解释它在现代Swift代码中的用途。 它是什么? 在Swift 3中引入后, open是比public更高(更宽松)的访问级别。 类型成员的访问级别被计算为该类型的真实访问级别和该成员声明的访问级别中的最小值。 如果班级是公开的,但成员是开放的,则真正的访问权限是公开的。 作为此规则的例外,属于公共类型的成员的开放类的真实访问级别是开放的。 简而言之,它“ 比公众更公开 ”。 但是,有什么比“公共”更公开的呢? 又为什么呢? 作为一种语言,Swift致力于子类化和覆盖,这是它的核心原则之一,但是,在设计框架时,鼓励开发人员投资于可覆盖性可能会付出一定的代价,因为设计用于子类化的类要比投入更多的精力。只是设计用于普通用途。 潜在地,另一个开发人员可能会出现,并且无私地改变类方法如何相互委派的行为。 这有可能破坏覆盖这些方法的后续子类。 在单个模块中,这样做的危险可以忽略不计,但是跨库边界,这可能会变得越来越成问题。 这是open关键字起作用的地方,它使开发人员可以区分公共可访问性和公共可重写性,明确说明可供某人使用但不能扩展的公共内容。 让我们以下面的伪代码 为例 如果该类在其自己的模块中声明, 在这种情况下, 让我们想象它是一个身份验证库,任何其他尝试对其进行子类化的代码都可以从Auth继承,因为它具有open关键字。 然后,子类可以覆盖login方法,因为该方法也被标记为open -请注意,不过resetPass方法使用的是public关键字。 可以显式设置此方法的访问级别,因为它可以被调用,但是不能更改 。 open关键字是防止开发人员意外覆盖核心功能的一种优雅而简单的方法,这对于您的库的工作至关重要。 tl:dr? 一个open类是可访问的并且可以被子类化 open班级成员可访问且可重写 可以访问public类,但不能将其子类化 public班级成员可以访问但不能覆盖 随时在下面的评论中留下任何问题🙂

IOS AVFOUNDATION播放基准

通过安德烈·波波夫 ( Andrey Popov) 随着iOS 11的引入,AVFoundation框架进行了一些更改,并扩展了新功能 。 因此,为了更好地理解和利用框架功能,以下是对去年在Apple WWDC上首次引入的AVFoundation Playback基准测试进展的介绍和评论。 AVFoundation功能 AVFoundation提供了用于多种多媒体操作的API,包括回放,图像捕获,导出和大量的编辑选项。 播放类型: 从本地存储: file:///…/example.MOV. 从将文件上传到的Web服务器,然后进行逐步下载: https://example.com/example.MOV. : https://example.com/example.MOV. 一种更动态的方法是HTTP Live Streaming(HLS)。 HLS播放播放列表。 播放列表是.txt文件。 它包含#EXTINF标签。 标签包含段(segment1.ts等),每个段的长度为10秒(#EXTINF 10.001)。 视频6Mbit播放列表; 影片4Mbit播放清单; 视频2Mbit播放列表音频立体声播放列表; 音频环绕播放列表; playlist.txt文件: #EXTM3U #EXT-X-VERSION:4 #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-MAP:URI=”patpmt.ts” #EXTINF 10.001 segment1.ts #EXTINF 10.001 segment2.ts 通常,默认URL与基本播放列表相关,该基本播放列表包含相同内容的多个播放列表,但根据传输速度,格式(有时甚至是语言)进行配置。 通过网络播放 今天, AVPlayerItem具有三个属性: playbackLikelyToKeepUp , playbackBufferFull和playbackBufferEmpty 。 在iOS 9及之前的版本中,AVFoundation客户端应控制渐进式下载属性,并等到它们设置AVPlayer.rate = 1之前,直到playbackLikelyToKeepUp和playbackBufferEmpty属性为true。 […]

在iOS上探索Firebase身份验证

将所有这些捆绑在一起,我们现在有了一个身份验证流程,该流程使我们能够轻松处理应用程序的登录状态和注销状态。 虽然我们只研究了电子邮件身份验证,但是Firebase提供的其他身份验证方法的操作与此类似。 这意味着切换到另一种方法不会对您的实现产生太大的改变。 我希望通过本文,您能够了解如何在应用程序中设置Firebase身份验证,以及如何在身份验证状态下利用其中的某些功能。 Firebase Auth提供了更多功能,因此绝对值得查看完整的文档以获取这些领域的更多信息。 如果您有任何疑问或意见,请随时与我们联系! 乔·伯奇(@hitherejoe)| 推特 Joe Birch(@hitherejoe)的最新推文。 Android主管和高级工程师。 @缓冲。 Google Developer Expert for… twitter.com

Swift 4中的多个ViewController(第2部分)

系列 Swift 4中的多个ViewController(第1部分) 如何在Swift 4 medium.com中使用Multiple ViewController Swift 4中的多个ViewController(第2部分) 如何在Swift 4 medium.com中使用Multiple ViewController Pada part 1 kita telah berhasil membuat多视图控制器。 Pada第2部分Ini Kita Akan Menguji Apakah视图控制器Kedua Berfungsi Semestinya Atau Tidak。 Mulai Pembuatan Projek Pada langkah pertama kita阿肯mendrag kembali按钮pada视图控制器pertama ke视图控制器kedua untuk membuat segue。 Setelah kita drag akan ada penghubung antara视图控制器pertama dengan yang kedua。 伊西坎·纳玛(Isikan nama)标识符 标识符boleh diisi […]