2017-07-17 6 views
0

APIから多くのリクエストを行うアプリケーションを作っています。だから、私はコードを何度もコピーして、何度も繰り返したいとは思わない。私はコードをもっと効率的に再利用する方法を知りましたか?たぶん拡張機能付き? これは私のコードでは、知っている:JSON HTTPリクエストヘッダーを再利用する方法を短くする

func apiRequest() { 
    let config = URLSessionConfiguration.default 
    let username = "****" 
    let password = "****" 
    let loginString = String(format: "%@:%@", username, password) 
    let userPasswordData = loginString.data(using: String.Encoding.utf8) 
    let base64EncodedCredential = userPasswordData?.base64EncodedString() 
    let authString = "Basic " + (base64EncodedCredential)! 
    print(authString) 
    config.httpAdditionalHeaders = ["Authorization" : authString] 
    let session = URLSession(configuration: config) 

    var running = false 
    let urlProjects = NSURL(string: "https://start.jamespro.nl/v4/api/json/projects/?limit=10") 
    let task = session.dataTask(with: urlProjects! as URL) { 
     (data, response, error) in 
     if let taskHeader = response as? HTTPURLResponse { 
      print(taskHeader.statusCode) 
     } 
     if error != nil { 
      print("There is an error!!!") 
      print(error) 
     } else { 
      if let content = data { 
       do { 
        let dictionary = try JSONSerialization.jsonObject(with: content) as! [String:Any] 
        print(dictionary) 

        if let items = dictionary["items"] as? [[String:Any]] { 
         for item in items { 
          if let description = item["Description"] as? String { 
           self.projectNaam.append(description) 
          } 
          if let id = item["Id"] as? String { 
           self.projectId.append(id) 
          } 
          if let companyId = item["CompanyId"] as? String { 
           self.companyId.append(companyId) 
          } 

         } 
        } 
        self.apiRequestCompani() 
       } 
       catch { 
        print("Error: Could not get any data") 
       } 
      } 
     } 
     running = false 
    } 


    running = true 
    task.resume() 

    while running { 
     print("waiting...") 
     sleep(1) 
    } 

} 

答えて

0

はい、あなたはBaseViewControllerを作成し、あなたが何度も何度もあなたのコードを使用する場所という拡張するための拡張機能を使用することができます。次に、そのメソッドへの入力パラメータに対するすべての動的データを抽象化する必要があります。

import UIKit 
class BaseViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad()  
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
} 

func getApiRequest (Parameters) { 
    //API Request 
} 

そして、あなたのビューコントローラであなただけのBaseViewController

class ViewController: BaseViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //Call method in baseviewcontroller 
    getApiRequest(parameters) 

    //Call method in self 
    self.getApiRequest(parameters) 
} 

override func getApiRequest(Parameters) { 

    //IF you need to override default configuration 
} 
+0

反応に感謝します。はい、私はそれを得るが、私はそれを達成することができなかったので、あなたはおそらく私にそれを行う方法の例を与えることができますか?ありがとう –

+0

@ R.H私は私の答えを編集します。彼自身のプロジェクトのコードをチェックすることができませんでしたか、それが動作するかどうかを確認してください – ppinho

+0

彼はありがとうBro、それは私をたくさん助けてくれました –

0

を拡張するには、だから私は何度もコピーしたコードを過ぎてしたくありません。

重複したコードを取得することは絶対に正しいです。それは大量表示コントローラの問題です。この問題は、アプリケーションのビューコントローラレイヤがネットワークからデータを取得する方法、データをどのように表現するか、ビューレイヤにフォーマットされたデータを配信するかなど、ほとんどの責任を処理するために発生します。

There (アプリケーションに適切なアーキテクチャパターンを使用して)このような問題を解決する方法はたくさんありますが、簡単にするために、アプリケーションにはMVC-N(またはMVCNetworking)アプローチを適用することをお勧めします。 (マネージャー)は、外部APIとの統合など、新しいレイヤーを表します。

MVN-Nを適用することは複雑ではありませんが、それでもよく解説する必要があります(答えに記載するにはあまりにも海外かもしれません)。above mentioned apple exampleを確認することをお勧めします。this videoは便利です。

+0

ありがとう、私は絶対にそれをチェックアウトします! –

関連する問題