金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > 垃圾回收机制的思考,Swift网络请求

垃圾回收机制的思考,Swift网络请求

发布时间:2019-12-15 23:56编辑:编程浏览(64)

    循环(Loops)

      在使用Alamofire进行网络请求的时候,相信大部分的同学都会封装一个抽象的NetworkLayer,如"APIManager" 或者 "NetworkModel"等等。但是位置业务功能增加,会渐渐混合各种请求,不够清晰,而Moya能很好地解决这类问题。Moya在Alamofire基础上进行封装,是一个允许高度自定义的网络层,可以根据具体的需求进行接口的设置。具体的介绍可以参考Moya的官方链接,结构图如下:

    一、前言

    1. For条件递增语句

     

    1  for ( var counter = 0; counter < 8; counter++ ) 
    2  {
    3           liftWeights( )
    4   }
    

     

     

     

    语法是这样的:用for作为循环的开始,告诉Xcode你要声明一个循环了,for后面跟着括号,括号里面声明变量、条件和递增数值。例如:

    1 for ( VARIABLE; CONDITION; INCREMENT ) 
    2  {
    3 
    4  }
    

     

    括号中的第一个部分是变量,用counter表示,计算已经完成的循环的数量,在平时编写程序时,这里的变量常常命名为counter(英文中counter有计数器的含义)然后设定初始值为零:

    1 for ( var counter = 0; CONDITION; INCREMENT ) 
    2  {
    3 
    4 }
    

     

    条件后面的一个分号后面是递增值,递增值就是每次循环后变量counter的变化:

    1 for ( var counter = 0; counter < 8; counter++ ) 
    2  {
    3 
    4 }
    

     

    然而苹果公司提供了简写方式,用两个加号++表示这个变量加1,例如:

    counter++
    

     

    作用和这个相同:

    counter = counter +1
    

     

     

    图片 1

      Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题。

    2. 区间(Ranges)

    区间Range和整型数组中一个数字到另一个数字差不多,目前有两种区间,一种是闭区间,用三个小点表示,包含小点两边的数字:

    1...5   //1,2,3,4,5
    

     

    另外一种是半闭半开区间,用两个小点加上一个小于号表示,小于号右边的数字不包含在这个区间中:

    1..<5     //1,2,3,4
    

     

    在for-in循环中,可以使用区间来代替数组或者词典:

     1 for index in 1...5 
     2 {
     3     println ("The current number is (index)")
     4 }
     5 
     6  //打印结果为:
     7  //The current number is 1 
     8  //The current number is 2 
     9  //The current number is 3 
    10  //The current number is 4 
    11  //The current number is 5
    

     

     

     

      内存泄漏:当程序不停运行,有一部分对象没有作用,但所占内存没有被释放,服务器内存随时间越来越少,最终导致系统的崩溃,所以内存泄漏是一个需要重点关注的问题。

    3. 条件表达式

     

    1 if isBirthdayToday == true 
    2 {
    3     singBirthdaySong ( )
    4 }
    

     

      在上面的这个例子中,条件是isBirthdayToday == true,两个等号表示比较2个等号之间的数值,如果值相同,则结果为真,如果值不相同,则结果为假。

     

      接下来就介绍一下Moya的一些常见的用法:

    二、引用计数

    4. 可选类型(Optionals)

    可选值是用来处理那些可能出现空值的变量。在某些情况下,你是无法确保一个变量是不是一定有值。例如,在西班牙语中的一个单词,可能无法直接翻译成英语的一个单词,这样就会出现空值。这种没有值的情况叫做nil。
    可选值可以用在任何类型的变量中,在使用时将一个问号跟在类型后面,表示这是可选值:

    1 var translatedWord: String?
    

     

    因为可能为空的变量都必须名称表示,这样能确保所有的非可选值变量都会有值。这种设计模式帮助开发者避免了空值引起的程序崩溃。非可选值变量都必须有值,可选值变量可以没有值。
    可选值不能直接使用,在使用之前需要解包(unwrapped)。把使用可选值变量想象成拆开一袋糖果,必须先要把包装撕掉才能吃到糖果。当一个可选值变量解包后,这个变量也可能是空值。这就相当于你拆开一颗糖果,结果发现里面什么也没有。
    解包的过程帮助开发者记住去检查然后确保这个变量不是空值,用可选值有2个步骤,第一步,检查是不是为空,一般情况下用if表达式检查:

    图片 2图片 3

    1 var translatedWord: String? = translate("cat")
    2 if translatedWord != nil {
    3        //translatedWord has a value
    4  } else {
    5      //The translatedWord has no value
    6  }
    

    View Code

    一旦核查确实有值后,你必须解包。解包一个可选值非常简单,直接放一个叹号在变量后面即可,例如:
    

    图片 4图片 5

    1 var translatedWord: String? = translate("cat")
    2 if translatedWord != nil {
    3     println(translatedWord!)    //gato
    4 }
    

    View Code

     

     

    5. 枚举

      5.1声明一个枚举

      枚举声明的类型是囊括可能状态的有限集,且可以具有附加值。通过内嵌(nesting),方法(method),关联值(associated values)和模式匹配(pattern matching),枚举可以分层次地定义任何有组织的数据。
    玩游戏的四个方向,如:
    
    1 enum Movement{
    2 case Left
    3 case Right
    4 case Top
    5 case Bottom
    6 }
    
     1 let aMovement = Movement.Left
     2 
     3 // switch 分情况处理
     4 switch aMovement{
     5 case .Left: print("left")
     6 default:()
     7 }
     8 
     9 // 明确的case情况
    10 if case .Left = aMovement{
    11 print("left")
    12 }
    13 
    14 if aMovement == .Left { print("left") }
    

     

      使用上述多种模式匹配结构获取到Movement的枚举值,或者按照特定情况执行操作。
    
    
      我们无须明确指出enum的实际名称(即case Move.Left:print("Left"))。因为类型检查器能够自动为此进行类型推算。这对于那些UIKit以及AppKit中错综复杂的枚举是灰常有用的。
    
      5.2 枚举值
      想要为enum中每个case分配一个值。这相当有用,比如枚举自身实际与某事或某物挂钩时,往往这些东西又需要使用不同类型来表述。在C语言中,你只能为枚举case分配整型值,而Swift则提供了更多的灵活性。
    
    1 // 映射到整型
    2 enum Movement: Int {
    3 case Left = 0
    4 case Right = 1
    5 case Top = 2
    6 case Bottom = 3
    7 }
    

     

      5.3获取枚举值

      倘若你想要读取枚举的值,可以通过rawValue属性来实现:

    1 // 同样你可以与字符串一一对应
    2 enum House: String {
    3 case Baratheon = "Ours is the Fury"
    4 case Greyjoy = "We Do Not Sow"
    5 case Martell = "Unbowed, Unbent, Unbroken"
    6 case Stark = "Winter is Coming"
    7 case Tully = "Family, Duty, Honor"
    8 case Tyrell = "Growing Strong"
    9 }
    
    1 //获取枚举值
    2 
    3 let bestHouse = House.Stark
    4 print(bestHouse.rawValue)
    

     

      5.4通过一个已有的raw value来创建一个enum case。
      这种情况下,枚举提供了一个指定构造方法:
    
    1 enum Movement: Int {
    2 case Left = 0
    3 case Right = 1
    4 case Top = 2
    5 case Bottom = 3
    6 }
    
    1 // 创建一个movement.Right 用例,其raw value值为1
    2 let rightMovement = Movement(rawValue: 1)
    

      倘若使用rawValue构造器,切记它是一个可失败构造器(failable initializer)。换言之,构造方法返回值为可选类型值,因为有时候传入的值可能与任意一个case都不匹配。比如Movement(rawValue:42)。

     

    参见:枚举中高级枚举实践

    刚刚开始接触可选值的时候会有一些困惑和不习惯,其实你只要记住,一个可能为空的变量必须是可选值,而当可选值为空时就叫做nil。
    

     

    (一)根据业务需求创建具体请求:

      Python 标记一个对象是否还有用的方法就是用引用计数,以下情形会为该对象的计数+1:

      打比方现在我们需要书写账户的相关接口,如Login、userInfo。那么首先我们得创建AccountService:

        1. 创建时  

    enum AccountService {
        case login(phoneNum: NSInteger,passWord: NSInteger)
        case logout
    }
    

        2. 被引用时

      然后让AccountService实现TargetType协议,定义请求需要的基本信息:

        3. 作为参数传入函数时

    extension AccountService: TargetType {
        var baseURL: URL {
            return URL(string: ServiceBaseURL)!
        }
    
        var path: String {
            switch self {
            case .login(_, _):
                return "accountService/login"
            case .logout:
                return "accountService/logout"
            }
        }
    
        var method: Moya.Method {
            switch self {
            case .login(_, _):
                return .post
            case .logout:
                return .get
            }
        }
    
        var parameters: [String: Any]? {
            switch self {
            case .login(let phoneNum, let passWord):
                return ["phoneNum": phoneNum, "passWord": passWord]
            case .logout:
                return nil
            }
        }
    
        var parameterEncoding: ParameterEncoding {
            return JSONEncoding.default // Send parameters as JSON in request body
        }
    
        var sampleData: Data {
            return "".data(using: .utf8)!
        }
    
        var task: Task {
            return .request
        }
    
    }
    

      相反,以下情形会为该对象的计数-1:

      如上我们就已经完成了网络请求所需要的一个endpoint。接着通过Moya提供一个发送请求的Provider就完成了基本的使用:

        1. 被del

    let provider = MoyaProvider<AccountService>()
    
    provider.request(.login(phoneNum: 12345678901, passWord: 123456)) { result in
    
                switch result {
                case let .success(response):
                    //...............
                    break
                case let .failure(error):
                    //...............
                    break
                }
            }
    

        2. 被重引用

    (二)通过HTTPHeader设置公共请求参数

        3. 函数执行完毕

      在实际开发中我们可能会需要在请求头内添加一些公共请求参数,如用于识别一些平台标志、辨别接口的版本号。你可以定义一个Endpoint的闭包,

      查看某一元素的计数可以通过 sys.getrefcount(),当引用计数为0 的时候,内存就会被释放。

    let publicParamEndpointClosure = { (target: AccountService) -> Endpoint<AccountService> in
                let url = target.baseURL.appendingPathComponent(target.path).absoluteString
                let endpoint = Endpoint<AccountService>(url: url, sampleResponseClosure: { .networkResponse(200, target.sampleData) }, method: target.method, parameters: target.parameters, parameterEncoding: target.parameterEncoding)
                return endpoint.adding(newHTTPHeaderFields: ["x-platform" : "iOS", "x-interface-version" : "1.0"])
            }
    

      可以想到和其他垃圾回收相比,Python的机制优点很明显,就是实时性,Python的gc 模块就是开放的接口用以管理。

    本文由金沙国际官网发布于编程,转载请注明出处:垃圾回收机制的思考,Swift网络请求

    关键词: