GCD是用于管理任务执行的库,对于开发人员而言,异步编程使开发更容易,更安全。 异步允许任务同时执行,而不是通过在不同线程/进程上并行运行来阻止当前执行线程。 通过在后台线程上处理长时间运行的块,同时仍允许用户与主线程上的UI进行交互,它使应用程序具有更高的响应速度。 术语 串行和同步是同义词,并发和异步是可互换使用的。 主队列-处理应用程序的所有UI和未明确要求在后台队列中运行的代码的队列。 串行-串行队列中的任务一个接一个执行,一次仅执行一个任务。 任务按照插入队列的顺序执行。 并发-允许您并行执行多个任务。 任务以它们添加到队列的顺序开始,但不必等待彼此开始执行。 执行和完成的顺序不是预定的。 dispatch_queues 有两种类型的调度队列(队列由dispatch_queue_t表示),串行的和并发的。 要使用串行队列,请使用主队列 让mainQueue = dispatch_get_main_queue 或创建自己的 让serialQueue = dispatch_queue_create(“ @ anthonyprograms”,DISPATCH_QUEUE_SERIAL) 使用并发队列时,有多种选择:使用系统队列或创建自己的队列。 有四个优先级不同的系统队列,从最高到最低分别是: DISPATCH_QUEUE_PRIORITY_HIGH DISPATCH_QUEUE_PRIORITY_DEFAULT DISPATCH_QUEUE_PRIORITY_LOW DISPATCH_QUEUE_PRIORITY_BACKGROUND 优先级指出哪个任务将首先运行,优先级越高,它执行得越早。 让systemConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) 您可以创建自己的 让currentparallelQueue = dispatch_queue_create(“队列”,DISPATCH_QUEUE_CONCURRENT) 将任务提交到队列 将任务提交到队列时,它可以同时运行或串行运行。 运行dispatch_sync(queue)依次运行该块,该块等待该块完成,然后再继续执行下一个任务。 并且dispatch_async始终是异步的。 只是您将所有UI块排队到同一队列中,因此不同的块将按顺序运行,但与数据处理代码并行运行。 队列示例 输出:“ polo \ n marco”。 这是因为GCD正在将异步代码块添加到队列中并继续运行该代码。 但是,当您更新UI时会发生什么? 在处理UI的后台线程上运行代码将导致崩溃。 为了在后台执行某些块,然后使用该结果来更改UI,必须首先获取主队列。 团体 假设您有一些更复杂的事情,需要更多类型的处理,并且只想在所有任务完成后更新UI。 这样,您可以使用dispatch_group_t。 […]
作为iOS开发人员,我一直着迷于编写甚至自己的应用程序的后端,以完全控制它。 我在工作时选择的语言是Swift,这让我惊讶不已。 它提供了真正的多功能用途。 除了对移动和桌面应用程序进行编程之外,它还被证明非常适合脚本编写,并且也越来越多地用于后端编程。 对于后端,显而易见的选择是Node.js。 服务器上的Javascript非常强大,而且由于其用途广泛,因此也易于访问。 围绕Node.js形成了一个大型社区,该社区现在生成了大量的各种库。 那为什么还要尝试新的东西呢? Javascript的主要优势在于它的传播; 但是,它往往会承担并非总是最好的体系结构决策的负担。 由于Javascript是松散类型的,因此基于Javascript构建的程序容易出现各种错误。 另一方面,从第一天开始,Swift一直是一种强类型语言。 但是,它仍然带有精心设计的类型推断系统,在该系统中,编译器可以从上下文派生类型。 Swift消除了我们从其他语言中知道的一些传统语法项,例如分号和多余的括号,从而产生了简洁,易读和有效的代码段。 Swift最初是一种仅限Apple平台的语言。 但是,它已经在版本2中向世界开放。新的开源方法使开发人员可以在主要的Unix平台上使用Swift,因此没有任何办法可以利用它进行后端编程。 旨在将Swift部署到服务器上的项目之一就是Vapor。 它不仅在其上构建的项目数量上非常出色,而且在它使用Swift的泛型和协议扩展等高级功能方面也非常出色。 让我们看一个例子。 以下代码显示了用于简单CD目录的REST API的一部分。 import Vapor import HTTP final class ArtistController { // Routes registration func addRoutes(drop: Droplet) { let group = drop.grouped(“artists”) group.get(handler: index) group.get(Artist.self, “albums”, handler: albumsIndex) let searchGroup = group.grouped(“search”) searchGroup.get(handler: search) } // GET […]
如果您要为移动应用程序构建后端,则必须采取什么步骤来完成它? 我将通过7个步骤总结后端开发: 确定后端和前端职责 编写初始端点并使其正常工作 设计API并记录下来 设计和实现数据库 编写后端测试脚本 使用编程语言实现API 部署 让我们更详细地完成每个步骤。 确定后端和前端职责 对于某些类型的应用程序,后端只是简单值的数据存储。 但是对于更复杂的应用程序,您可能必须在后端而不是前端执行复杂的任务。 在两种情况下,您将在后端执行复杂的任务: 您的数据需要在服务器上进行验证。 例如,用户试图播放音频文件,但是服务器必须通过检查数据库来检查她是否有权播放文件。 您的数据与系统的其他部分(例如数据库)进行交互。 例如,您的应用程序注册了一个必须更新用户数据库的用户,该用户数据库将向用户发送验证电子邮件,还向系统管理员发送电子邮件。 还有其他原因可能会在后端而不是前端上执行操作。 关键是要在开始之前大致弄清楚这一点。 编写初始端点并使其正常工作 在确定后端的职责之后,是时候启动并运行某些东西了。 您可以与客户端连接的实际服务器端点。 使用向后后端技术来实现这个目标。 这意味着为后端和前端应用程序都编写存根函数。 不是完整的API,而是足够使您拥有最少的工作后端。 设计API并记录下来 第三步是设计您的后端API。 关于设计RESTful API的讨论很多,但我认为您不必遵循本书的RESTful原则。 相反,只需清楚地记录每个后端API端点应该做什么。 对于每个端点,请清楚地记录客户端需要提供哪种类型的值,以及后端将返回哪种类型的值。 指定哪些值是必需的,哪些值是可选的。 例如,假设您有一个get_movies端点,该端点根据日期范围返回电影列表。 如果客户端提供了日期范围,则它将返回在该日期范围内创建的电影。 如果未提供日期范围,则使用从当前日期开始的过去一周。 记录这一事实很重要。 这似乎很简单,但是关键是要对其进行记录并保持 文档更新。 设计和实现数据库 现在,您可以从API文档中了解数据的结构以及如何存储它们。 在大多数情况下,请使用MySQL。 遵循良好的数据规范化原则,但要走得足够远 有意义,仅此而已。 编写后端测试脚本 用bash / curl或Python编写一个快速测试脚本,以验证所有后端端点是否正常运行。 使用编程语言实现API 现在是时候使用编程语言来构建API。 我更喜欢使用Python。 (我将在截屏视频中更详细地介绍) 部署后端 您可以使用诸如AWS之类的云服务来部署后端来托管后端,也可以使用专用主机。 这是一个很大的主题,我一定会在另一篇文章中介绍。 […]
介绍: 要成为iOS开发人员,我们首先需要明确的概念和一些主题。今天,我列出了这些主题和有关这些主题的简短描述。希望它将帮助您简化旅程。 Xcode: 首先,我们需要一个IDE来开发Apps。Apple为MacOS,iOS和所有其他Apple Flat开发平台构建了这个出色的IDE。因此,在我们开始开发之前,我们需要知道如何使用此IDE。这是有关Xcode的有用文章: 面向初学者的Xcode教程(已针对Xcode 8.2更新) 本教程面向初学者,了解如何使用Xcode 8构建应用程序。 这个Xcode教程还将贯穿所有…… codewithchris.com 语言-Swift或Objective C: 苹果有用于开发iOS Apps Objective C和Swift的语言。 我个人更喜欢Swift,但是您对目标C有基本的了解。 斯威夫特: 一些主题我们需要有清晰的概念。 这些是 关闭 协议 泛型 类和结构 延期 财产观察员 这是使用Swift语言的Apple官方文档: Swift.org Swift是一种通用的编程语言,使用安全性,性能和软件的现代方法构建而成…… swift.org UIDesign: 要构建应用程序,首先必须设计应用程序用户界面,例如Storyboard,Xib或Programmatically。 因此,为此,我们需要了解Xcode提供的组件或自定义组件的实现及其功能。我们需要通过故事板上的自动布局来固定这些组件的位置,或者通过编程来添加约束。 有三种方法可以在应用程序屏幕上添加组件以设计用户界面。 通过 故事板 Xib文件 以编程方式 我们可以通过 自动版面 添加约束 UIComponent: 苹果为开发人员提供了一些非常重要的组件,每个按钮,按钮,标签,文本字段等应用程序都需要它。 在这里,我列出了每个应用程序中需要的这些组件。 纽扣 标签 文本字段和文本视图 滑杆 tableView collectionView 视图 应用程序生命周期: iOS应用程序具有生命周期。iOS应用程序有5种状态:未运行,不活动,活动,后台和已暂停。 应用程序如何以及何时经历这五个状态称为应用程序生命周期。 […]
自定义表格单元格iOS开发。 自定义表格单元格是最常用的视图之一,可能在每个应用程序中都可以找到,这里是一些需要注意的基本内容并按照说明进行操作。我将使用已定制表格的现有汽车应用程序完成该项目细胞。 创建一个单元.xib文件 设置单元格的约束 设置该单元格的属性标签 在TableView中显示数据 创建具有任何自定义名称的项目。在视图控制器中,添加TableView并为所有视图设置约束“ 0”。即使您已嵌入导航栏,也将约束设置为“ 0”。 创建一个具有自定义名称的TableViewCell和一个单元格.xib文件。首先将一个UIView保留在单元格中,然后使用此视图作为参考,将所有约束设置为“ 0”,以定义标签。UIView用灰色定义颜色易于理解。在视图中,我有一个汽车图像,汽车名称,汽车里程,成本,所在区域。提及了“ carsDataCell”单元格的标识符。 现在为表视图单元设置了约束,我们必须将所有标签和图像属性拖放到表视图单元文件上。 为此创建一个通用函数,这样您就不会忘记标签。标签中有图像,资产中有静态图像。 首先在视图中加载,然后将委托和数据源设置为self。同时添加UITableViewDelegate和UITableViewDataSource协议。在视图中注册创建的单元格后,请确保正确指定名称。 函数CellForRowAt有一个用cellIdentified定义的单元格,并提到了CellName(CarsTableCell)。然后您可以调用在该单元格中声明的函数。 函数numberOfRowInSection具有定义的行,这些行指定为carsName或carsArea的计数。 定义TableCell的高度,并确保您还为单元格.xib文件中的单元格指定了相同的高度。 这就是今天的美好时光!!
介绍 : 成为一名优秀的iOS开发者,正确学习非常重要。我们都知道互联网是最好的学习资源。但是在互联网上很多资源如果我们不知道去哪里,还有什么比难学的更好。因此,今天我将为iOS开发人员列出学习资源清单。 开始: 成为iOS开发人员之前,我们需要首先了解一种语言.Apple有两种本机语言Swift和Objective C.因此这里列出了Swift和Objective C博客以及您可以在其中学习的文章。 1,苹果Swift Book 它是学习Swift的最佳书籍,从基础到高级。可以从Apple网站免费下载。 2. swift.org Swift组织是学习Swift的另一个最佳资源 Swift.org Swift是一种通用的编程语言,使用安全性,性能和软件的现代方法构建而成…… swift.org iOS: 1.Apple说明文件: Apple官方文档最适合每个iOS开发者标签。所有Apple提供的框架和API都在此处进行了详细记录: Apple开发人员文档 浏览最新的开发人员文档,包括API参考,文章和示例代码。 developer.apple.com 2.雷文德利希(Raywenderlich): Raywenderlich是iOS开发最古老,最经典的网站之一。 raywenderlich.com | 高质量的编程教程:iOS,Android,Swift,Kotlin,Unity和… 高品质的编程教程:iOS,Android,Swift,Kotlin,Unity等! www.raywenderlich.com 3.AppCoda: App Coda是另一个经典网站,为初学者和中级iOS开发人员提供完整的iOS教程。 AppCoda –通过实践学习Swift和iOS编程 AppCoda是一家教育型创业公司,致力于教人们如何学习Swift和iOS编程博客。 我们的… www.appcoda.com 4,骇人听闻: 另一个iOS和Swift Great博客: 使用Swift进行黑客攻击–学习带有免费Swift 4教程的iPhone和iPad应用程序编码 通过这些免费的Swift 4教程 www.hackingwithswift.com 学习iOS的Swift编码。 5,编码探究器 它的经典网络博客特别适合初学者: Coding Explorer Blog –探索如何在Swift和Objective-C中为iOS编码 当天的最新更新已到:截至昨天,Swift现在已开源! 这预示着Swift的新时代…… www.codingexplorer.com […]
dateOfBirthTextField.textFieldType = .DatePickerTextFielddateOfBirthTextField.updateUIAsPerTextFieldType() phoneNumberTextField.textFieldType = .PhoneNumberTextFieldphoneNumberTextField.updateUIAsPerTextFieldType() stateTextField.pickerViewArray = [“ ALASKA”,“ ARIZONA”,“ ARKANSAS”,“ CALIFORNIA”,….] stateTextField.textFieldType = .TextPickerTextField stateTextField.updateUIAsPerTextFieldType() 您也可以将此AITextField用作常规UITextField。 添加左右视图 myTextField.setLeftGap(宽度:10,placeHolderImage:UIImage(名称:“设置”)!)或myTextField.setRightGap(宽度:10,placeHolderImage:UIImage(名称:“复制”)!) 样式输入视图 我们可以使用在文本字段的底部添加一个分隔符。 myTextField.createSeparator(borderColor:.darkGray,xpos:10) 检查下面的github回购AITextField类和一个演示应用程序。 appitventures / AITextField-iOS AITextField-iOS –这是UITextField的包装器类,具有与单个键盘不同的键盘/选择器类型。 github.com 如果您喜欢这篇文章,并且对您有所帮助,请给我一些鼓掌! 随意发表您对此主题的评论。 请关注AppIt Ventures,以获取其他类似文章。 感谢您阅读😄
在这里,我们再次慢慢地成为一名出色的iOS开发人员。🙂在本课程中,我们将经历循环和条件。 首先让我们看一下循环。 循环 循环用于遍历数据集合并对其执行一些任务。 我们知道Swift中的三种循环: while , repeat-while和for-in 。 While循环 var homeworkDone = false 而!homeworkDone { 打印(“做我的作业”) } 尽管这不是while循环的很好示例,但我希望您了解它是如何工作的。 这很简单,虽然homeworkDone不是正确的,但它会打印“正在做作业”。 为什么这是一个不好的例子? 因为它将永远运行,因为我们没有更改homeworkDone变量,所以那不是确定的 。 这个例子不错,只是为了让您了解它是如何工作的。 重复循环 变数= 0 重复{ 数字=数字+ 1 }而数字<10 你觉得和重复的时候很相似吗? 唯一的区别是此代码在检查条件之前执行了代码。 循环内 var carsInMyGarage = [“特斯拉S型”,“三菱蓝瑟X”,“高尔夫R”,“焦点RS”] 用于carsInMyGarage中的汽车{ 打印(汽车) } for-in循环用于循环遍历数据集合并对其进行处理。 在这种情况下,我们将打印carsInMyGarage数组中的每辆车。 “ Car”只是临时存储数组中数据的变量,您可以随意调用它。 通过此循环,您还可以循环显示一系列数字。 您可能会这样: 1 … 5中的数字{ 打印(数量) } 这将打印从1到5的数字。您也可以使用以下非包含范围: 对于1 .. […]
在这篇文章中,我将讨论在我正在努力使IOS应用程序开发更强大的项目中使用的其他可重用类。 我最近需要导航路由器来处理网络请求中不同类型的URL,处理一堆.GET,.POST,.PUT。 删除HTTP请求类型等 使用单独的类来处理网络任务是一个好主意。 因此,使用自定义路由器。 它当然是基于Alamofire。 什么是路由器? 路由器是一种处理API /微服务url的面向协议的方法,但将自身用作枚举是一个更好的主意。 通过从枚举案例中生成URL请求,这将无缝地在发出请求时帮助统一和简化网络路由。 因此,另一种方法启发了我一些概念,您可以阅读LittleBitesOfCocoa中的博客文章。 公平地说,它更轻巧,但不能满足我的要求。 #93:为Alamofire创建路由器🔀🔥 Alamofire 3.0(https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%203.0%20Migration%20Guide.md…littlebitesofcocoa.com 创建路由器协议 首先,创建一个协议RouterProtocol来处理四种方法,以使REST兼容(获取,发布,更新,销毁),以处理常见的API请求(我刚刚声明了自己的ApiType来获取API URL的路径/路由,因此不是)在上下文中,则省略。) 接下来要做的就是创建一个路由器枚举 ,这个实现为什么呢? 我会解释。 首先,我们需要遵循RouterProtocol才能使用我们的功能。 Router枚举必须为通用类型,必须接受具有RouterProtocol一致性的任何类型的结构。 它接收四个动词(.GET,.POST.PUT,.DELETE等),因此可以为其声明方法,路径和路由属性。 将URLRequest属性创建为NSMutableURLRequest,因此添加常用配置,例如方法,默认标头,OAuth令牌(如果可用)等。 最后,使用Alamofire的参数编码可以执行所需的编码。 用法 使用路由器非常简单,只需在ApiManager中声明一个方法(我将在另一篇文章中介绍我的ApiManager版本) 在我的示例中,getAccounts方法将AccountsRequest作为输入 ,response作为AccountsResponse作为输出,此类仅是结构,您可以自己滚动 (仅供参考:在另一篇文章中,我将向您介绍基于“请求/响应”结构的方法) 您的经理(当然,它封装了Alamofire实例)会执行请求(可到达性和微调器内容不在上下文中。我会在此处发布有关可到达性的信息,您可以在此处阅读) Alamofire管理器将Router枚举作为输入,并具有我们的RouterProtocol,我们说这是一个.GET请求,所以我确实将诸如accountRequest.accountId的值作为String传递,因为在协议中。GET匹配请求具有“ case get(T,String) ” 如果我们需要说这是一个.POST请求,则协议.POST可以将 [ String:AnyObject])作为参数,因此,这一次我必须将我的accountRequest输入传递为cast到Dictionary()? [String:AnyObject])等 简单! 例如; Router.get(AccountsRouter(),accountRequest.accountId!)。URLRequest 现在,您可以看到为任何种类的Api创建任何种类的Router都具有表现力。 它始终严格定义,可理解且干净。 这篇文章中的代码,托管在Github中 seyhunak /路由器 在Swift github.com中使用路由器为IOS应用程序更好地路由 感谢您的阅读,希望您喜欢。
在本系列的第一部分中,我们讨论了触摸处理。 现在,让我们更深入地研究“响应者链”的工作方式,并查看可在iOS应用程序中处理的其他类型的事件:运动事件,远程控制事件和按键命令。 有关响应者链的更多信息 我们在介绍触摸事件时简要概述了响应程序链,但让我们仔细看一下。 响应者链是在整个应用程序中传递这些其他类型事件的主要机制。 响应者链的概念很简单。 它由UIResponder对象链组成。 链中的每个元素都有机会响应给定的消息。 如果给定的响应者不响应该消息,则链中的下一个项目将有机会进行响应。 如果链中没有对象响应该消息,则该消息将被丢弃。 第一个有机会响应消息的对象称为“第一响应者”。第一响应者是最近调用-[UIResponder成为FirstResponder]的对象 。 通过覆盖-[UIResponder canBecomeFirstResponder]并返回YES,对象可以成为第一响应者。 当对象作为第一响应者完成时,调用-[UIResponder resignFirstResponder] 。 作为动作事件和远程控制事件的响应者,非常简单。 作为第一响应者的对象被发送了运动或远程控制消息。 然后,它就有机会响应事件,将事件发送到响应者链,或者通过处理事件然后在超类上调用方法来完成。 涉及的方法在UIResponder中定义。 Apple的UIResponder类参考是获取更多信息的重要来源。 在实践中 我们可能会问,“这一切都很好,但是我可以在实践中使用它吗?”让我们来看一个示例应用程序。 首先,请克隆GitHub存储库。 该应用程序不是很有用,但是它演示了响应程序链如何工作的简单示例。 它需要一个硬件键盘,并且只能做一件事:在灰色框中打印字母“ a”。 它可以在模拟器或带有键盘的任何iOS设备中正常运行。 让我们深入一些代码。 首先,让我们看一下主视图控制器: 类ViewController:UIViewController { @IBOutlet弱var customTextView:CustomTextView! @IBAction func textViewTapped(_ sender:AnyObject){ customTextView.becomeFirstResponder() } } 这个视图控制器很简单。 它包含CustomTextView类型的自定义视图,并处理在情节提要中配置的轻击手势识别器的操作。 轻击手势处理程序在customTextView上调用beginFirstResponder 。 现在让我们看一下CustomTextView 。 类CustomTextView:UIView { 私人var textToRender:NSString吗? { didSet { […]