1

私のウェブサーバーコールをインターラインswift 3.0化するためのフレームワークのサポートとともに、プロジェクトに取り組んでいます。Alamofire基本的に、メソッドを宣言する場所で以前に使用したシングルトンクラスを使用しswift 2.3たいので、実行したいビューコントローラーでメソッドを次のように呼び出します。

APIManager.sharedInstance.login(username, password: password, completion: { (user,success) in

                if success {

                }

                }) { (error) in       

 }

私の要件は、swift 3.0作業を続行できるように、このコードを機能させることです。これに関するヘルプをいただければ幸いです。My singleton クラスのコードは次のとおりです (このコードは にありswift 2.3、3.0 でこれが必要です)。

    import UIKit
    import Alamofire
    import SwiftyJSON

struct Singleton {
  static let instance : APIManager = APIManager()
}

public class APIManager: NSObject {
  public class var sharedInstance: APIManager {
    return Singleton.instance
  }

  let manager = Manager()

  override init() {

  }

  //MARK:====Login====

  //MARK: methods

  func login(username: String, password: String, completion: (user: User, success: Bool) -> (), failed:(error: NSError) -> ()) -> Request {
    let urlRequest // Create a URLRequest and pass to the method

    return manager.request(urlRequest)
      .validate()
      .responseJSON { response in
        if let error = response.result.error {
          failed(error: error)
          print(error)
          return;
        }
        let ok = ((response.result.value as! JSONDictionary)["success"] as? Bool)!
        let userJson = JSON((response.result.value as! JSONDictionary)["user"]!)

        let token = ((response.result.value as! JSONDictionary)["token"] as? String)!
        NSUserDefaults.standardUserDefaults().setValue(token, forKey: UserDefaultKey.Token)
        NSUserDefaults.standardUserDefaults().synchronize()
        let user = User(json: userJson)
        completion(user: user,success: ok)

        print ("Auth is :  \(token)")


    }
  }
}
4

1 に答える 1

3

これは Alamofire 4.x と SwiftyJSON を使用した Swift 3.x の私のマネージャーです。シングルトンの代わりにクラスメソッドを好みます。

import UIKit
import Alamofire
import SwiftyJSON

class APIManager: NSObject {

class func apiGet(serviceName:String,parameters: [String:Any]?, completionHandler: @escaping (JSON?, NSError?) -> ()) {

    Alamofire.request(serviceName, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if let data = response.result.value{
                let json = JSON(data)
                completionHandler(json,nil)
            }
            break

        case .failure(_):
            completionHandler(nil,response.result.error as NSError?)
            break

        }
    }
}

class func apiPost(serviceName:String,parameters: [String:Any]?, completionHandler: @escaping (JSON?, NSError?) -> ()) {

    Alamofire.request(serviceName, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if let data = response.result.value{
                let json = JSON(data)
                completionHandler(json,nil)
            }
            break

        case .failure(_):
            completionHandler(nil,response.result.error as NSError?)
            break

        }
    }
}

}

apiGetおよびapiPostメソッドを使用して、コントローラー自体にサービスの名前または URL を提供することをお勧めします。

それの使い方。
コントローラー クラスまたはボタン イベントで

SwiftyJSONコントローラーへの最初のインポート

import SwiftyJSON

次に、好きな場所でログインサービスを呼び出します

let params = [
        "userName":"abc",
        "password":"abc"
    ]

APIManager.apiPost(serviceName: "yourLoginURL", parameters: params) { (json:JSON?, error:NSError?) in
        if error != nil {
            print(error?.localizedDescription)
            return
        }
        print(json!)
    }
于 2016-11-02T05:14:56.660 に答える