Tag: 联网

认识团队:Francesco Deliro,移动第一工程师

当我购买第一台笔记本电脑时,一切就开始了。 每次遇到问题时,我都想自己修复,直到解决问题后才离开办公桌。 我参加了不同的编程课程,并阅读了很多文章。 在对编程充满热情之后,我决定以谋生为生。 我作为iOS开发人员已经3年了,我相信这只是一次激动人心的冒险的开始。 无论是舒适的环境还是友善的人们,We Are Mobile First办公室都是我喜欢工作的地方,他们和我一样拥有同样的热情,也富有挑战性。 宜人的天气,美味的食物,多元文化的环境和海滩使巴塞罗那成为理想的居住场所。 它既不会太大也不会太小。 您在这里不会感到无聊。 在寒冷的几个月里,我喜欢写故事和阅读。 在温暖的季节,我喜欢在海滩上度过时间或做运动。 我也喜欢旅行和与家人共度时光。 阅读更多我们的博客文章:www.wearemobilefirst.com

在Swift中隔离任务,或如何创建可测试的网络层。

在过去的几年中,有许多闪亮的iOS体系结构越来越受到人们的炒作。 因为它们都是有效的,并且有好有坏,所以它们都解决了同一件事: 将业务逻辑与表示分离。 今天,我将写一个简单的概念,该概念适用于您下一个项目的架构,无论您打算使用哪种架构。 相当普通的网络层 为了解释我的观点,我将首先谈谈通常如何实现网络层。 我见过很多不同的网络层。 在大多数情况下,都有NetworkManager,ConnectionManager或类似的东西。 有一个类包含应用程序中的每个API调用。 尽管这是有效的并且可以正常工作,但它并没有遵循软件设计的核心概念: 单一职责。 ConnectionManager包含太多职责,因此不被认为是好的做法。 而且,它通常实现为单例。 我并不是说单例不一定很坏,但是不能将它们作为依赖项注入,并且在测试时不能轻易模拟。 这是非常常见的做法。 我也在MVVM或MVP架构中看到了这一点。 不同的方法 数据访问层可以以不同的方式实现。 让我们描述网络获取的过程: 这样,网络调用至少包含三个步骤: 创建一个请求 :这意味着设置URL,方法,参数(在URL路径或http正文中)和HTTP标头。 发货请求 :这是非常非常重要的一步。 必须使用URLSession或其上的一层(例如Alamofire)调度在上一步中创建和配置的请求。 获取和解析响应 :重要的是,此步骤应与前两个步骤分开实施。 在这里,您应该验证JSON或XML响应,然后将其解析为有效的Entity(如果愿意,也可以解析为Model)。 如果您确实希望您的体系结构干净且可测试,则应在不同的对象中实现这三个步骤。 这些对象如下: Request : Request对象具有配置网络请求所需的一切。 它是负责配置单个网络请求的结构或类。 这非常重要: 一个网络请求,一个 Request 对象。 NetworkDispatcher : NetworkDispatcher是一个对象,负责获取Request并返回Response 。 它应该作为协议来实现。 您应该针对该协议而不是针对具体的类(或结构)进行编码,并且永远不应将其实现为单例。 如果执行此操作,则可以将该NetworkDispatcher替换为实际上不发出任何网络请求的MockNetworkDispatcher ,而是从JSON文件获取响应,从而形成自然可测试的体系结构。 NetworkTask : NetworkTask是通用类Task的子类。 正如我将在稍后更好地解释的,任务是一个通用类,它负责以同步或异步方式获取Input类型并返回Output类型。 您可以使用RxSwift,ReactiveCocoa,Hydra,Microfutures,FOTask或仅使用闭包来实现Task 。 由你决定。 这里的重要部分是概念,而不是实现细节。 实施请求 […]

认识iOS开发人员Pere Daniel Prieto

我于2014年完成博士学位,并决定在次年年底进入企业领域。 在接受Data Analyst职位面试后,我于2016年5月最终成为一名初级iOS开发人员。 从那时起,我担任过多个角色,从混合开发人员到初级QA,从成熟的iOS开发人员到最近的初级DevOps角色。 还有很多东西要学! 我一生都住在巴塞罗那及其周边地区,这是一个生活的好地方。 天气晴朗,食物美味; 城市周围的海滩,山脉和河流。 巴塞罗那拥有您想要的一切! 它足够大,可以多元文化,但是又足够小,可以在短时间内到达任何地方,这真的很方便! 我真的很喜欢安装和绘画模型,主要是微型游戏。 我也喜欢玩大多数棋盘游戏,也喜欢为新手准备“演示游戏”。 ____ 在我们的网站上与我们团队的其他成员进行交流:www.wearemobilefirst.com。 想与我们合作? 给我们发送电子邮件:hi@wearemobilefirst.com

Moya入门

Moya是一个Swift网络抽象库。 它为我们提供了一种无需直接与Alamofire进行通信即可进行网络呼叫的抽象方法。 通过本教程,我们将学习如何开始使用框架,发现一些技巧和窍门以及从代码示例中学到所有基础知识。 让我们首先讨论为什么不使用 Moya: 它为您的项目引入了依赖性。 项目的成功部分取决于Moya的稳定性。 有更多原因使您不想使用Moya,但它们都是第一点的衍生副作用。 您应该始终考虑为任何项目添加依赖项的成本。 要更深入地分析为什么最好在Swift中从头开始构建自己的API管理器,请帮个忙,并阅读Matteo Manferdini撰写的精彩文章。 刚开始使用Cocoapods时,我以为找到了一些开发人员的超能力。 我最终意识到,了解事物的实现方式比拥有库中的超级代码更为重要。 这就是您提高开发人员技能的方式。 Moya背后没有一些与服务器通信并返回JSON的黑魔法代码! 如果我们允许别人去思考,我们将失去力量和收缩的能力。 —艾伦·怀特 为什么您会选择Moya: 立即设置API管理器。 干净的代码和最佳实践。 专注于应用程序的核心功能,而不是网络。 易于为单元测试添加网络响应。 了解如何使用流行的Swift网络库。 您是否曾在工作岗位上看到“使用REST API的最佳实践和知名库的经验”? 我一定有 使用Moya这些和其他包含的内容有很多好处,但这并不意味着用纯Swift编写网络层是困难的或不希望的。 可以使用首选的依赖安装方式来安装Moya:https://github.com/Moya/Moya#installation 提示:安装依赖项时,请始终指定库版本。 例如,如果您正在使用Cocoapods,请为您的项目指定一个特定的版本号! pod’Moya’,’10 .0.1’#撰写本文时为最新版本。 在建立网络经理之前,我会事先建议一些设计和规划! 是的,我知道,作为开发人员,我们只想获取代码。 但是花一些时间来计划我们的工作将是值得的投资。 那么,我应该计划构建一个网络管理器吗? 没有那么多! 让我们保持简单,直到两个问题。 我总是在计划时会先提出一些需要提供答案的问题: 我将向哪些端点请求数据? 如何建模从端点返回的数据? 当回答这两个问题时,我只需简单地在笔记中列出所有端点,然后从预期的JSON创建伪代码模型。 如果您正在使用已经有文档的API,则可以使用提供的文档作为参考。 对于大多数示例,我将使用The Movie Database API🍿。 借助Swift 4的Codable协议,我们无需使用任何对象映射库或编写自定义映射器即可将JSON转换为模型。 让我们建立我们的电影模型,MovieResults模型。 电影模特 如果我们向The Movie Database API请求获取播放电影的请求,则返回的JSON响应如下所示。 […]

使用Alamofire 5和可编码的第1部分:在Swift 4中编写网络层:API路由器

如今,使用Web服务API是现代移动应用程序开发的重要组成部分。 在本文中,我想分享一种使用Alamofire和Swift 4设置网络层的简单方法。 我们将在构建API客户端时完成以下步骤: API路由器:端点构建器 API客户端:创建并执行请求 可编码:解析JSON并映射到数据结构 使用未来/承诺 使用反应式编程(ReactiveCocoa和RxSwift) 在第一部分中,我们将重点介绍请求构建器组件。 API路由器:端点构建器 具有一个提供端点的API请求构建器组件很重要。 路由器将使用HTTP method , HTTP headers , path和parameters来呈现端点 推荐的方法之一是使用Swift Enum创建我们的API路由器。 这是路由器的实现: 端点构建器 理想情况下,您有一个Constants.swift文件,可以将所有常量都放在一个位置

基于协议的通用网络-第2部分JSONEncoder和Swift中的Post请求可编码。

自从我在那篇文章中写了“在Swift 4中使用JSONDecoder和Decodable的基于协议的通用网络”以来,我一直在谈论如何使用Decodable,协议和泛型来创建可重用的网络层。 效果很好,但API仅限于GET HTTP方法,这就是为什么在本教程中我想将其扩展为使用POST方法,我将尽力向您展示如何使用枚举来完成这项工作,我假设您没有读过第1部分,因此在新项目中我将从零开始,您可以随时返回第一部分以了解更多详细信息。 我们将从GenericAPI类开始,创建一个新文件并复制并粘贴… 协议GenericAPIClient {var session:URLSession {get} func fetch (带有请求:URLRequest,解码:@escaping(Decodable)-> T ?,完成:@escaping(Result )-> Void )}扩展名GenericAPIClient {typealias JSONTaskCompletionHandler =(Decodable ?, APIError?)->无效的私有函数解码任务(带有请求:URLRequest,decodeType:T.Type,completionHandler的完成:@转义JSONTaskCompletionHandler)-> URLSessionDataTask {let任务= session.dataTask(with:request){数据,响应,防护错误让httpResponse =响应为? HTTPURLResponse否则{completion(nil,.requestFailed(description:error?.localizedDescription ??“无描述”))return} guard httpResponse.statusCode == 200 else {完成情况(nil,.responseUnsuccessful(description:“ \(http(Response.statusCode )“))return}保护let data = data else {complete(nil,.invalidData); return} do {letgenericModel = try JSONDecoder()。decode(decodingType,from:data)complete(genericModel,nil)}捕获let err { }} return task} ///成功响应在主线程上执行。 func fetch […]

SwiftCoders三月聚会

嗨,iOS开发人员, 感谢您昨日在亚美尼亚 Picsart参加SwiftCoders亚美尼亚的聚会。 这是我们共同提出的几点。 1.下次我们在2019年3月6日开会。 详细信息将很快提供。 得到你的票 2.让我们通过以下渠道继续关注 * Facebook页面上的新闻和更新 https://www.facebook.com/swiftcoders/ *直接通信的电报频道 https://t.me/SwiftCoders *闲聊和小组讨论 https://swiftcodersinvite.herokuapp.com/ ( 登录后加入#yerevan频道) 3.众所周知,我们已经创建了一个开源GitHub项目,以使我们能够一起编码并在聚会期间集体讨论解决方案。 https://github.com/SwiftCoders亚美尼亚 4.这是昨天的演讲 * Vahagn Gevorgyan的 “面向协议的编程” https://goo.gl/UMkq5f * Ghukas Stepanyan撰写的 “使用您的Linkedin个人资料进行个人品牌 推广” https://goo.gl/9btMCA 5.请给聚会打分 https://mogoni.typeform.com/to/Zs1zfX 6.如果您错过了下载LinkedIn的个人资料图片,请点击链接 https://goo.gl/Comj4v ** 什么是新的 我们的下一个活动是2019年3月6日。 https://swiftcoders.am ================================= SwiftCoders亚美尼亚是https://swiftcoders.org计划的一部分。 **(https://www.facebook.com/swiftcoders/) **(https://github.com/SwiftCodersArmenia/) **(https://www.swiftcoders.am/) **(https://www.swiftcoders.org/)

Swift中的网络层

如何避免经常被称为NetworkManager的Big-Fat-Singleton™并快乐地生活 在此链接中可以找到 本文的新更新版本 。 作为开发人员,每次启动新项目时,我们都会编写,重写和重构大量内容。 有时有充分的理由来进行这类活动(想想Swift和Obj-C中的面向协议的编程 ),更经常的是,我们继续开心地做一些我们认为很干净的代码,有意识地忽略了时间的客观损失( … 直到我们开始下一个项目 )。 这些有趣的活动之一涉及软件的网络层。 所有应用程序中有99.99%会在某个时刻与Internet通讯,因此这是所有软件的关键点。 这些年来,我已经看到并编写了许多不同的网络层。 除了一些罕见的情况外,大多数情况都是作为一个称为NetworkManager的巨大单例类(或类似的东西)实现的,该类具有有关网络内容的程序的全部知识。 所有应用程序中有99.99%会在某个时刻与Internet通讯,因此这是所有软件的关键点。 在我之前的工作中,有一个大型的企业计划-目标是完成一个不完整的代码并将其投入生产:我花了一个多星期的时间来摆脱这个庞大的怪物(我喜欢称之为FNM : FatNetworkManager ),使它“更小”; 范围是同时支持两个不同的用户会话(一个用于应用程序本身,另一个用于手表配套应用程序),因此,单个实体不仅是设计问题,还是实际问题。 即使这种单例方法通常可以毫无问题地工作,但在良好的软件设计原则之一中,它很少会失败:单一职责。 在本文中,我将通过分离网络工作流的每个步骤来为该问题提供一个可能的解决方案。 但是,首先,关于SRP只需几句话。 SOLID中的S:单一职责 无论我们认为什么是出色的代码,它始终需要一种简单的质量:代码必须是可维护的。 任何无法维护并且不能相对轻松地适应不断变化的需求的代码就是等待变得难以管理然后过时的代码。 SRP是SOLID原则的一部分( 单一职责 , 开闭 , liskov替换 , 接口隔离 , 依赖项倒置 )。 虽然我们没有足够的时间来展示每个人,但是第一个字母S代表单一责任原则 ,其重要性不能被夸大:在任何编写不佳的代码中,您总是可以找到一个承担多个责任的类。 在任何编写不佳的代码中,您总是可以找到一个承担多个责任的类 我的FNM违反了SPR(… 几乎到处都是 ):它了解有关连接的所有信息(基本url,每个请求的路径),如何构建和执行每个请求,如何解析响应数据以及最终还管理内部用户会话以及一些其他内容。用户的个人资料数据(一场噩梦!)。 与网络连接相关的所有内容都位于这个庞大的单例类中。 而且,尽管我并不是说单例不一定很坏,但也不能将它们作为依赖项注入,也不能为测试目的而轻易地模拟它们。 我们可以做得更好……如何? 如我们所见,绝大多数网络层架构如下所示: 为了分离责任,我们需要通过创建几个状态来破坏怪物,每个状态实现工作流程的单个步骤。 这使我们能够分离问题并创建工作流,在此我们还可以注入模拟数据来执行测试。 我们可以将网络过程分为以下任务: 1.构建请求 :此对象负责创建请求以及常见参数,例如HTTP Method ,标Headers , […]

Swift 4.0中的网络层

每当我开始一个新项目时,都会出现相同的问题。 如何实现网络层? 使用Moya,Alamofire等外部库或从头开始编写它。 我对这个问题的回答是–使用不带任何第三方库的纯Swift。 当然,实现面向协议的层非常简单,使用enum键入safe来配置端点并完全可测试。 在这几点中,您将学习如何编写可定制的面向协议的网络层。 在开始之前,了解URLSession及其组成类很重要。 通常, URLSession负责发送和接收HTTPRequests 。 对于基本请求,您可以使用没有配置对象的shared会话。 它不像您自己创建的会话那样可定制,但是如果您有非常有限的要求,它可以作为一个很好的起点。 对于其他类型的会话,您URLSession使用以下三种配置之一实例化URLSession : .default –会话表现为共享会话,但允许进行更多配置并使用委托增量获取数据。 .ephemeral –会话也类似于共享会话,但是不要将缓存,cookie或凭据写入磁盘。 .background –会话使您可以在应用程序未运行时在后台执行内容的上载和下载。 URLSession以两种方式返回数据: 完成处理程序 在委托上调用方法 在会话中,您可以创建URLSessionTask以从服务器检索数据,上传照片或下载文件。 此外,您还可以继续,暂停和取消任务。 URLSessionTask提供了暂停运行任务的机会,例如,当用户离开应用程序时暂停任务,并在返回时恢复任务。 URLSession提供三种类型的任务: data –使用Data对象发送和接收数据。 数据任务旨在向服务器发出简短的,经常是交互式的请求。 upload –与数据任务相似,但通常用于在应用程序不运行时上传文件并支持后台上传。 download –以文件形式检索数据,并在应用程序未运行时支持后台下载和上传。 在本教程中,您将仅使用第一种URLSessionTask来发送请求并处理服务器的响应。 简要回顾一下URLSession可以做什么URLSession ,现在让我们进行一些练习。 首先,您必须将网络层划分为小型服务。 将所有请求都保存在一个类/枚举中是很难维护的,并且可能会变成一个庞然大物。 ServiceProtocol将帮助创建URLRequest 。 ServiceProtocol包含构成组件,例如baseURL,路径,方法,标头,任务和parametersEncoding。 继续创建您的第一个简单网络层文件。 HTTPMethod是一个枚举,负责设置请求的HTTP方法。 URLRequest具有.httpMethod属性以设置方法的字符串类型。 Task是一个枚举,负责为特定服务配置参数。 您可以添加适用于您的网络层要求的情况。 例如upload(Data) , download(parameters: Parameters)等。该示例只有两种情况可以发送普通请求或带有参数。 ParametersEncoding是负责设置编码类型的枚举。 在此示例中,您必须使用最流行的:URL和JSON。 瞧! 创建网络层的第一部分已经完成。 […]

Moya作为具有可编码的网络层

莫雅是什么? 为什么呢? Moya是我们想要一些网络抽象层来充分封装实际直接调用Alamofire的层。 它应该足够简单,以使常见的事情变得容易,但是应该足够全面,以使复杂的事情也变得容易。 Moya的出色功能: 编译时检查API端点访问是否正确。 使您可以定义具有关联的枚举值的不同端点的明确用法。 将测试存根视为一流公民,因此单元测试非常容易。 安装 安装部分在Moya的Github页面上描述得非常好。 API 我们将使用JSONPlaceholder作为我们的API。 让我们从模型开始 对于输出模型,我们将使用typealias Codable = Encodable&Decodable 。 使用TargetType创建API枚举 为了使发布尽可能容易,我们将只使用1个POST和2个GET路由。 让我们创建API枚举: 并在其之上添加Moya的必要扩展: 首先, baseURL 。 这用于我们的API的基本URL: 接下来, path 。 我们使用它来定义不同的路由(例如/ posts , / comments等): 接下来, 方法 。 我们可以为不同的func定义不同的方法: 接下来,我们需要样本数据进行测试。 我们不会在那个帖子上介绍这个。 因此,让我们给它一个简单的Data() : 接下来,我们需要定义任务 。 我们需要.requestPlain来获取所有Post 。 .requestParameters用于获取特定的Post 。 最后, .requestJSONEncodable用于使用我们的Codable对象创建一个Post 。 最后,我们需要headers 。 这将与我们的所有请求一起发送: 创建我们的网络代表 […]