2016-09-20 4 views
0

私はiPhoneの開発に着手しました。多くの方々のおかげで、簡単なアプリケーションが動作しました。私は以下のコードを使ってmysqlデータベースからデータを取得していました。このコードはcommonfun.swiftファイルにあり、ここではすべての機能を保持しており、必要なときにはさまざまな迅速なファイルから呼び出します。通信リンクにより、30秒間試行されます。Swift Xcode NSURLConnection.sendSynchronousRequestは非推奨です

すべてが素晴らしいです。これは、関数の "終わり"にある配列にデータをロードし、呼び出すswiftファイルに "戻る"ために同期されます。

のサンプルコードは、次のとおりです。

import UIKit 
class commonfunc 
{ 
    var result1: [String] = []; 

func DB_To_Array_Swift(whattoget: String, inout jsondata: NSDictionary) 
    ... set up stuff 
    ... call php to get data 
while while_exit == "NO" 
    { 
     number_of_retries = number_of_retries + 1 
     if number_of_retries > 30 
     { 
      break 
     } 
     do 
     { 
      urlData = try NSURLConnection.sendSynchronousRequest(request, returningResponse:&response) 
      while_exit = "YES" 
     } 
     catch let error as NSError 
     { 
      tmperror = error 
      while_exit = "NO" 
      sleep(1) 
     } 
    } 
... load data into an array and return to calling swift file. 

は素晴らしい作品!異なる基準でさまざまな迅速なファイルから呼び出されます。

今、NSURLConnection.sendSynchronousRequestは償却されています。

NSURLSession.sharedSession()で置き換えようとしましたが、非同期で実行され、メインのswiftファイルに戻ります。

私は以下でそれを置き換えようとしました。しかし.....

while while_exit == "NO" 
    { 
     number_of_retries = number_of_retries + 1 
     if number_of_retries > 30 
     { 
      while_exit == "YES" 
      break 
     } 
      let session = NSURLSession.sharedSession() 
      let task = session.dataTaskWithRequest(request) 
      { 
       (
       let urldata, let response, let error) in 
       if error != nil 
       { 
        tmperror = error! 
        while_exit = "NO" 
        sleep(1) 
       } 
       let dataString = NSString(data: urldata!, encoding: NSUTF8StringEncoding) 
       print(dataString) 

       while_exit = "YES" 
      } 
      print("\n here5") 
      task.resume() 
      print("\n here6") 

    } 
    while while_exit == "NO" 
    { 
     sleep(1) 
    } 

私はそれがcommonfunc.swiftで同期を見えるようにするが道

おかげ

+0

は 'sleep'は、同期ネットワークは、非常に非常に悪いです }) task.resume() dispatch_semaphore_wait(セマフォ、DISPATCH_TIME_FOREVER) 戻りデータ;、エラー=エラー{印刷(エラー)} dispatch_semaphore_signal(セマフォ)を聞かせ悪い。非同期パターンを使用する方法は常にあります。あなたのケースでは 'NSURLSession'と' NSURLSessionDataTask'を使い、デリゲートメソッドを実装してください。 'didCompleteWithError'では、タイマーを起動してエラー時にタスクを再実行するか、受信したデータから文字列を作成し、配列にデータをロードしてswiftファイル*に戻ります。 – vadian

答えて

0

VARデータ:NSDataの? 。= LETセマフォゼロ:dispatch_semaphore_t = dispatch_semaphore_create(0) LETタスク= NSURLSession.sharedSession()dataTaskWithRequest(リクエスト、completionHandler:{ taskData、_、エラー - >() データに= taskData データ場合==ゼロ

+0

上記をテストして検索します。 –

+0

セマフォも悪いです。 – vadian

+0

悪い悪い悪い...だからもしあればあなたの提案は何ですか。 –

関連する問題