2016-09-20 1 views
0

저는 iPhone 개발에 착수했습니다. 많은 개발자 덕분에 간단한 응용 프로그램을 사용할 수있게되었습니다. 나는 mysql 데이터베이스에서 데이터를 가져 오기 위해 다음 코드를 사용했다. 이 코드는 commonfun.swift 파일에 있으며 모든 기능을 보유하고 있으며 필요에 따라 다양한 신속한 파일에서 호출합니다. 통신 링크로 인해 30 초 동안 시도합니다.Swift Xcode NSURLConnection.sendSynchronousRequest는 더 이상 지원되지 않습니다

모두 훌륭합니다. 이것은 함수의 "끝"에서 배열로 데이터를로드하고 호출하는 swift 파일로 "return"하기 때문에 동기화됩니다.

샘플 코드는 다음과 같습니다

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를? . = 전무하게 세마포어 : dispatch_semaphore_t dispatch_semaphore_create = (0) 하자 태스크 NSURLSession.sharedSession =() dataTaskWithRequest (요청 completionHandler { taskData, _ 에러 ->() 데이터 = taskData 경우 데이터 == 전무

+0

위 테스트를 거쳐 찾으십시오. –

+0

세마포어도 좋지 않습니다. – vadian

+0

나쁜 나쁜 나쁜 ... 그래서 있다면 제안은 무엇입니까. –