반응형
어떻게 든 Swift에서 NSURLSession을 통해 동기 HTTP 요청을 할 수 있습니까?
NSURLSession
Swift에서 어떻게 든 동기식 HTTP 요청을 할 수 있습니까 ?
다음 코드를 통해 비동기 요청을 수행 할 수 있습니다.
if let url = NSURL(string: "https://2ch.hk/b/threads.json") {
let task = NSURLSession.sharedSession().dataTaskWithURL(url) {
(data, response, error) in
var jsonError: NSError?
let jsonDict = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &jsonError) as [String: AnyObject]
if jsonError != nil {
return
}
// ...
}
task.resume()
}
그러나 동기 요청은 어떻습니까?
미리 감사드립니다.
이 NSURLSession 확장을 사용하여 동기 메서드를 추가 할 수 있습니다.
extension NSURLSession {
func synchronousDataTaskWithURL(url: NSURL) -> (NSData?, NSURLResponse?, NSError?) {
var data: NSData?, response: NSURLResponse?, error: NSError?
let semaphore = dispatch_semaphore_create(0)
dataTaskWithURL(url) {
data = $0; response = $1; error = $2
dispatch_semaphore_signal(semaphore)
}.resume()
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
return (data, response, error)
}
}
Swift 3 업데이트 :
extension URLSession {
func synchronousDataTask(with url: URL) -> (Data?, URLResponse?, Error?) {
var data: Data?
var response: URLResponse?
var error: Error?
let semaphore = DispatchSemaphore(value: 0)
let dataTask = self.dataTask(with: url) {
data = $0
response = $1
error = $2
semaphore.signal()
}
dataTask.resume()
_ = semaphore.wait(timeout: .distantFuture)
return (data, response, error)
}
}
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request
returningResponse:(__autoreleasing NSURLResponse **)responsePtr
error:(__autoreleasing NSError **)errorPtr {
dispatch_semaphore_t sem;
__block NSData * result;
result = nil;
sem = dispatch_semaphore_create(0);
[[[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (errorPtr != NULL) {
*errorPtr = error;
}
if (responsePtr != NULL) {
*responsePtr = response;
}
if (error == nil) {
result = data;
}
dispatch_semaphore_signal(sem);
}] resume];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
return result;
}
의해 답변을 Quinn "The Eskimo!" Apple 개발자 관계, 개발자 기술 지원, 핵심 OS / 하드웨어
대신 URLRequest를 사용하도록 답변 중 하나를 업데이트하여 대신 PUT 등을 사용할 수 있습니다.
extension URLSession {
func synchronousDataTask(urlrequest: URLRequest) -> (data: Data?, response: URLResponse?, error: Error?) {
var data: Data?
var response: URLResponse?
var error: Error?
let semaphore = DispatchSemaphore(value: 0)
let dataTask = self.dataTask(with: urlrequest) {
data = $0
response = $1
error = $2
semaphore.signal()
}
dataTask.resume()
_ = semaphore.wait(timeout: .distantFuture)
return (data, response, error)
}
}
나는 이렇게 부른다.
var request = URLRequest(url: url1)
request.httpBody = body
request.httpMethod = "PUT"
let (_, _, error) = URLSession.shared.synchronousDataTask(urlrequest: request)
if let error = error {
print("Synchronous task ended with error: \(error)")
}
else {
print("Synchronous task ended without errors.")
}
사용자 경험이 나빠질 수 있기 때문에 동기 요청에주의해야하지만 때때로 필요하다는 것을 알고 있습니다. 동기 요청의 경우 NSURLConnection을 사용하십시오.
func synchronousRequest() -> NSDictionary {
//creating the request
let url: NSURL! = NSURL(string: "exampledomain/...")
var request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
var error: NSError?
var response: NSURLResponse?
let urlData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)
error = nil
let resultDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options: NSJSONReadingOptions.MutableContainers, error: &error) as! NSDictionary
return resultDictionary
}
반응형
'Nice programing' 카테고리의 다른 글
번 들러는 보석을 어디에 보관하나요? (0) | 2020.12.11 |
---|---|
와일드 카드가 일치하는 파일 찾기 (0) | 2020.12.11 |
Spark Dataframe의 처음 1000 개 행을 가져 오는 방법이 있습니까? (0) | 2020.12.11 |
Jupyter 노트북의 변수 탐색기 (0) | 2020.12.11 |
수은에서 작업 개정을 어떻게 찾을 수 있습니까? (0) | 2020.12.11 |