2016-09-20 3 views
0

Я только начал с разработки iPhone, и благодаря многим там я получил простое приложение, работающее. Я использовал следующий код для извлечения данных из базы данных mysql. Код находится в файле commonfun.swift, где я держу все функции, и это вызов из любого быстрого файла при необходимости. Из-за линий связи он будет пытаться в течение 30 секунд.Swift Xcode NSURLConnection.sendSynchronousRequest устарел

Все это отлично работает. Он синхронизируется, потому что он загружает данные в массив в «конце» функции и «возвращает» в вызывающий быстрый файл.

ОБРАЗЦА КОД СЛЕДУЮЩЕМ:

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(), но он запустил async и вернулся к основному быстрому файлу.

Я попытался заменить его ниже. но .....

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' очень плохо, синхронные сети очень Плохо. Всегда есть способ использовать асинхронные шаблоны. В вашем случае используйте 'NSURLSession' и' NSURLSessionDataTask' и реализуйте методы делегата. В 'didCompleteWithError' запускается таймер и повторно запускается задача при ошибке или создается строка из полученных данных и продолжается * загружать данные в массив и возвращаться к вызову swift file *. – vadian

ответ

0

уаг данные: NSData? . = Ноль пусть семафор: dispatch_semaphore_t = dispatch_semaphore_create (0) пусть задача = NSURLSession.sharedSession() dataTaskWithRequest (запрос, completionHandler: { TaskData, _, ошибка ->() в данных = TaskData если данные == ноль пусть ошибка = ошибка {печати (ошибки)} dispatch_semaphore_signal (семафор); }) task.resume() dispatch_semaphore_wait (семафор, DISPATCH_TIME_FOREVER) возвращает данные

+0

Протестировано выше, и это работает. –

+0

Семафоры тоже плохие. – vadian

+0

плохой плохой плохой ... так каково ваше предложение, если оно есть. –

Смежные вопросы