2017-09-21 2 views
-1

うまくいけば、誰かがこれに答えてくれることを願っています。ios swift - 関数によってインデックス作成に時間がかかり、ビルドしない

なぜxcodeがいつまでコンパイルしたのか、それがビルド/インデックス作成に苦しんでいた理由を知りました。

public func setLocationsToSession(view: UIViewController, Completion callback: @escaping (_ status: String) -> Void) { 
    getStudentLocations(view: view){(error, data) in 
     print("setting session") 
     print(data) 

     if let results = data!["results"] { 
      for student in results as! [AnyObject] { 
       // check the object for the required keys/subscripts 
       if let objectId = student["objectId"], let uniqueKey = student["uniqueKey"], let fname = student["firstName"], let lname = student["lastName"], let mapString = student["mapString"], let mediaURL = student["mediaURL"], let lat = student["latitude"], let lng = student["longitude"], let createdAt = student["createdAt"], let updatedAt = student["updatedAt"] { 
        // some other students are forgetting to POST/PUT the required key-value pairs in their request(s), 
        // and it breaks my code/app. So this is why i have all of these optional defaults 
        if(fname as String == "" || lname as String == "" || lat as String == "" || lng as String == "" || lat == 0 || lng == 0) { 
         // ignore the bad ones 
         continue 
        } 
        let newStudent = Student(dict: [ 
         "objectId": objectId as? String ?? "", 
         "uniqueKey": uniqueKey as? String ?? "", 
         "firstName": fname as! String, 
         "lastName": lname as! String, 
         "mapString": mapString as? String ?? "", 
         "mediaURL": mediaURL as? String ?? "", 
         "latitude": lat as! Double ?? 0.0, 
         "longitude": lng as? Double ?? 0.0, 
         "createdAt": createdAt as? String ?? "", 
         "updatedAt": updatedAt as? String ?? "" 
         ]) 
        session.studentLocations.append(newStudent) 
       } 
       else { 
        continue 
       } 

      } 
     } 
     else { 
      let value = keys.error 
      callback(value) 
     } 

     let value = error == true ? keys.error : keys.success 
     callback(value) 
    } 
} 

public func getStudentLocation(view: UIViewController, key: String, Completion callback: @escaping (_ Error: Bool) -> Void) { 
    var reqDICT: [String: Any] = [String:Any]() 

    reqDICT["url"] = "https://parse.udacity.com/parse/classes/StudentLocation?where={\"uniqueKey\":\"\(key)\"}" 
    reqDICT["method"] = "GET" 

    let request = NSMutableURLRequest(url: URL(string: escapeString(value: reqDICT["url"] as! String))!) 
    request.httpMethod = reqDICT["method"] as! String 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("QrX47CA9cyuGewLdsL7o5Eb8iug6Em8ye0dnAbIr", forHTTPHeaderField: "X-Parse-Application-Id") 
    request.addValue("QuWThTdiRmTux3YaDseUSEpUKo7aBYM737yKd4gY", forHTTPHeaderField: "X-Parse-REST-API-Key") 
    reqDICT["request"] = request 

    httpRequest(view: view, requestDICT: reqDICT) {(error, data) in 
     print("error: \(error) ; data: \(data)") 

     if let results = data!["results"], results.count > 0 { 
      print("results exist: \(results.count)") 
      let Res = results as! [[String:AnyObject]] 
       let student = Res[0] as! AnyObject 
       print("results: \(results)") 
       print("student: \(student)") 
       let newStudent = Student(dict: [ 
        "objectId": student["objectId"] as? String ?? "", 
        "uniqueKey": student["uniqueKey"] as? String ?? "", 
        "firstName": student["firstName"] as? String ?? "", 
        "lastName": student["lastName"] as? String ?? "", 
        "mapString": student["mapString"] as? String ?? "", 
        "mediaURL": student["mediaURL"] as? String ?? "", 
        "latitude": student["latitude"] as? Double ?? 0.0, 
        "longitude": student["longitude"] as? Double ?? 0.0, 
        "createdAt": student["createdAt"] as? String ?? "", 
        "updatedAt": student["updatedAt"] as? String ?? "" 
        ]) 
       session.you = newStudent 
       session.objID = student["objectId"] as! String 
       session.dataExists = true 

     } 
     else { 
      session.dataExists = false 
     } 

     callback(error) 
    } 

} 

HTTPリクエストからのJSON応答を処理するためにこれらの関数を作成しました。問題は、結果配列内のすべてのjsonオブジェクトが同じキーを持つわけではないことです。一部の人は他の人が行うキーを持っていません。そのため、私が書いたこの2つの関数では、if letステートメントのJSONオブジェクトのキーをアンラップしようとしましたが、nilを防ぐために新しいstructをインスタンス化しています。これは、xcodeがこれらの2つのコメントを書き留めたときにコンパイル/ビルド/実行するために、xcodeが永久にコンパイルされる原因となっています。これについてどうすればいいですか?ありがとう!

答えて

1

これは辞書のリテラルです。あなたが物事をスピードアップしたい場合は、通常の方法で辞書を作成してから、すべての項目を追加してください。例えば、

var newStudent = [String: String]() 
newStudent["objectId"] = student["objectId"] as? String ?? "" 
// etc... 
+0

okですので、最初に辞書を作成してからStruct権限に渡しますか?私はそれを試してみる。ありがとう! – ryanwaite28

+0

https://medium.com/@RobertGummesson/regarding-swift-build-time-optimizations-fc92cdd91e31をご覧になり、そこに記載されているツールを使用することもできます。 – valcanaia

関連する問題