2016-08-04 6 views
0

Я новичок в разработке приложения ios, я пытаюсь подключить https-сервер, у меня возникла проблема. Я не могу подключить самоподписанный certficate, поэтому я искал сеть. В том, что я следил за приведенным кодом, его рабочий штраф , но работает асинхронно mode.so мне нужно до завершения задачи ожидания и вернуть data.Please дал какие-либо идеи?/Как сделать синхронный запрос с помощью NSOperationQueue?

func requestAsynChronousData(request: NSURLRequest)->NSData? { 
    let data: NSData? = nil 
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue:NSOperationQueue.mainQueue()) 
    let task = session.dataTaskWithRequest(request){ (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 
     if error == nil { 
     print("RESULTTTT\(data)") 
     } 
    } 
    task.resume() 
    return data; 
} 

func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { 
    print("WAITING!!!!!!!!!!!!!COMPLETIONHANDLER") 
    completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)) 
} 
+0

Если вы не делаете это на вторичном потоке, вы никогда не должны * выполнять синхронные запросы URL. В основном вы гарантированно получите отказ от магазина приложений, если вы это сделаете, потому что iOS автоматически убивает приложения, которые блокируют основной поток более нескольких секунд, а таймаут HTTP занимает до 90 секунд. Все, что можно сделать синхронно, также можно выполнить асинхронно. Вы просто должны проектировать вокруг него. Например, вместо написания функции, которая возвращает значение, вы можете написать функцию, которая берет блок и передает значение этому блоку, когда запрос завершается. – dgatwood

ответ

0

Вам нужно добавить dispatch_semaphore_create вам код, как показано ниже

func requestAsynChronousData(request: NSURLRequest)->NSData? { 
    let data: NSData? = nil 
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 

    let semaphore = dispatch_semaphore_create(0) 

    let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue:NSOperationQueue.mainQueue()) 
    let task = session.dataTaskWithRequest(request){ (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 

     if error == nil { 
     print("RESULTTTT\(data)") 
     } 

     dispatch_semaphore_signal(semaphore) 
    } 
    task.resume() 

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
    return data; 
} 

, но это путь заблокирует ваш основной поток, пока ваш обработчик завершения будет выполнен

+0

Привет Его не работает. все еще ждущий .. он не вернет данные – vara

+0

сделал ваш звонок завершения блока? – iSashok

+0

Да .. У него есть ожидание ... не уходит .. – vara

0

Я нашел решение.

func requestAsynChronousData(request: NSURLRequest)->NSData? { 
let data: NSData? = nil 
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue:nil) 
let task = session.dataTaskWithRequest(request){ (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 
    if error == nil { 
    data=taskData 
    print("RESULTTTT\(data)") 
    } 
    dispatch_semaphore_signal(semaphore) 
} 
task.resume() 
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
return data; 
} 

func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { 
print("WAITING!!!!!!!!!!!!!COMPLETIONHANDLER") 
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)) 
} 
0

В качестве альтернативы, вы можете установить максимальное количество операций по очереди к 1.

let operationQueue = NSOperationQueue() 
operationQueue.maxConcurrentOperationCount = 1 

let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue:operationQueue) 
let task = session.dataTaskWithRequest(request){ (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 

    if error == nil { 
    print("RESULTTTT\(data)") 
    } 
} 

operationQueue.addOperation(task) 

Это заставит операции в этой очереди, чтобы действовать синхронно без использования семафоров, которые позволят NSOperationQueue очистить up