2017-02-16 3 views
-1

私は、この機能を使用して、MySQLデータベースからプレーヤーのスコアを回復しています。他のチュートリアルでは、アプリケーションからデータを送信するときにURLSessionのアプローチが有用であることがわかりましたが、実際に関数の戻り値をどこでも使用できるようになりましたか?のようなものを探し続けるリターンのある関数でURLSessionを使用できますか?

task.resume() 
task.end() 
return (rank, name, score) 

func downloadLocalScores(_ choice: Int) -> ([String], [String], [String]) { 
    var url: URL 
    let id: String = getUserID("id") 
    if choice == 0 { 
     url = NSURL(string: "myPHPscript.php")! as URL 
    } else { 
     url = NSURL(string: "myPHPscript2.php")! as URL 
    } 
    let request = NSMutableURLRequest(url: url) 
    request.httpMethod = "POST" 
    let postString = "id=\(id)" 
    request.httpBody = postString.data(using: String.Encoding.utf8) 
    var name: [String] = [] 
    var score: [String] = [] 
    var rank: [String] = [] 
    if Reachability().isInternetAvailable() == true { 
     let task = URLSession.shared.dataTask(with: request as URLRequest) { 
      data, response, error in 
      if error == nil { 
       let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
       let variables = try! JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray 
       for i in 0..<variables.count { 
        let level = variables[i] as! [String:AnyObject] 
        name.append(level["name"] as! String) 
        score.append(level["score"] as! String) 
        rank.append(level["rank"] as! String) 
       } 
      } else { 
       print(error) 
      } 
     } 
     task.resume() 
     return (rank, name, score) 
    } else { 
     return (["NO CONNECTION"], ["0"]) 
    } 
} 

私はスコアをダウンロードするには、別の機能を持っていますが、トップのスコアを要求され、アプリ

func downloadScores(_ choice: Int) -> ([String], [String]) { 
var url: URL 
if choice == 0 { 
    url = NSURL(string: "myPHPscript.php")! as URL 
} else { 
    url = NSURL(string: "myPHPscript2.php")! as URL 
} 
let data = NSData(contentsOf: url) 
var variables: NSArray = [] 
if Reachability().isInternetAvailable() == true { 
    variables = try! JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray 

    var name: [String] = [] 
    var score: [String] = [] 

    for i in 0..<variables.count { 
     let level = variables[i] as! [String:AnyObject] 
     name.append(level["name"] as! String) 
     score.append(level["score"] as! String) 
    } 
    return (name, score) 
} else { 
    return (["No connection"], [""]) 
} 

}

からの任意の入力を取る必要はありません、私は完全にまだないです私のアプリからデータを送信する他のオプションに慣れているので、最後の機能はPOSTに適応できますか?昨夜何か試したが、NSMutableURLRequestの代わりにタイプURLを要求するデータ= NSDataにこだわってしまった。

グローバル変数を作成して最初の関数を追加する必要がありますが、その結果が使用された後にリカバリされ、いっぱいになると遅延や更新の方法が見つかりません。私は、彼らがviewDidLoad()の後で使用されるので、それらを待っているアプリは気にしない。

+0

NSURLSessionで「返された」値を持つことはできません。非同期システムをバイパスしようとしているということだけではありません。バイパスすることはできますが、お勧めしません。ちょうど閉鎖を使用してください。物事は、非同期のものを使用していない、現在のスレッドをブロックする必要があります、そして、それは主なもので、UIを(かなり醜い)ブロックしています。また、 'NSData(contentsOf:)'はPOSTではなくGETを実行しています。 – Larme

+0

あなたの質問は何ですか? – alecnash

答えて

0

ネットワークリクエストが非同期的に発生するため、リターンできません。戻り値を使用する代わりに、要求が完了したときに呼び出されるクロージャを使用します。以下をチェックしてください:

func sendRequest(_ _request:URLRequest, completion:@escaping (_ success:Bool,_ error:Error?, _ _data:[String:AnyObject]?)->Void) -> URLSessionDataTask { 
    let session:URLSession = URLSession(configuration: URLSessionConfiguration.default, delegate: nil, delegateQueue: self.queue) 
    let task:URLSessionDataTask = session.dataTask(with: _request) { (_data, _response, _error) in 
     if let resultsDic:[String:AnyObject] = self.parseJSONFromData(retrievedData, withInitalKey: self.getInitialKey()){ 
      completion(true, nil, resultsDic) 
     } else { 
      completion(false, nil, nil) 
     } 
    } 
    task.resume() 
    return task 
} 
0

私は、入力、復帰、および非同期補完の違いを示す小さな例を作成しました。これをあなたの遊び場に貼り付け、実験してください。

「渡された」プリントが最初に表示されます。

リターンが続きます。

最後に、非同期が完了すると完了します。

import UIKit 
import PlaygroundSupport 
import Foundation 

func getStuffFromServer(_ passedIn: String, completion: @escaping (_ completion: String)->()) -> String { 

    print(passedIn) 

    PlaygroundPage.current.needsIndefiniteExecution = true 

    URLSession.shared.dataTask(with: URL(string: "http://stackoverflow.com")!) { 
    result in 

     completion("I've completed") 

     PlaygroundPage.current.finishExecution() 

    }.resume() 

    let returnValue = "I'm being returned" 
    print(returnValue) 
    return returnValue 
} 

let returned = getStuffFromServer("I'm passed in", completion: { completion in 
    print(completion) 
}) 
関連する問題