2016-08-04 31 views
0

Ich bin Neuling für die Entwicklung der IOS-Anwendung, ich versuche, https Web-Server zu verbinden, hatte ich Problem konfrontiert Ich bin nicht in der Lage, die selbstsignierte Zertifikat zu verbinden, also habe ich net gesucht In dem ich unten angegebenen Code gefolgt habe funktioniert es gut . aber seine Arbeit asynchronen mode.so Ich brauche bis zur vollständigen Aufgabe warten und kehrt die data.Please gab eine Idee?/Wie synchrone Anforderung mithilfe von 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

Sofern Sie dies nicht auf einem sekundären Thread tun, sollten Sie keine synchronen URL-Anfragen * jemals * tun. Grundsätzlich wird die Ablehnung aus dem App Store garantiert, da iOS Apps, die den Hauptthread blockieren, automatisch für mehr als ein paar Sekunden beendet und ein HTTP-Timeout bis zu 90 Sekunden dauert. Alles, was synchron ausgeführt werden kann, kann auch asynchron erfolgen. Sie müssen nur darum herum entwerfen. Anstatt eine Funktion zu schreiben, die einen Wert zurückgibt, können Sie beispielsweise eine Funktion schreiben, die einen Block übernimmt und den Wert an diesen Block weitergibt, wenn die Anforderung abgeschlossen ist. – dgatwood

Antwort

0

Sie hinzufügen müssen dispatch_semaphore_create Sie Code wie unten

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; 
} 

aber Way wird Ihren Haupt-Thread blockieren, während Ihr Abschluss-Handler fertig ist

+0

Hallo Es funktioniert nicht. wartet noch .. es wird keine Daten zurückgeben – vara

+0

hat Ihr Abschluss Block Anruf? – iSashok

+0

Ja .. Es hat warten ... nicht quit .. – vara

0

Ich habe die Lösung gefunden.

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

Alternativ können Sie die maximale Anzahl von Operationen an der Warteschlange zu 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) 

gesetzt Dadurch werden die Operationen in dieser Warteschlange zwingen synchron zu handeln, ohne Semaphore verwendet, die NSOperationQueue können reinigen selbst