swift 스스로 간이 네트워크 요청을 봉하여 폐쇄된 작은 구덩이에서 탈출
swift에서 클립 (closure) 이라고 불리는 oc의 Block과 유사한 것을 정의했습니다.
typealias networkSuccessClosuse = (_ data:Data?, _ response:URLResponse?, _ error:Error?) -> Void
그리고 요청의 유형을 나타내는 매거값을 정의했다(POST, GET 등은 스스로 추가할 수 있다. 나는 여기에 이 두 개만 썼다)
enum netMethod:String {
case GET = "get"
case POST = "post"
}
일반적인 도구 클래스에서 우리는 방문 인터페이스의 유일한 대상으로 하나의 예를 설정할 것이다. 여기에 나도 하나의 예를 썼다. (swift의 예는 비교적 직관적이다)
static let netWorkManager = NetWorkTool()
private override init() {
이제 URLSessino로 데이터를 요청합니다.
public func netWork(url:String, method:netMethod, paramates:[String : AnyObject]?, result:@escaping networkSuccessClosuse) {
var i = 0
var urlString = url
let session:URLSession = URLSession.shared
var request:URLRequest = URLRequest(url: URL.init(string: url)!, cachePolicy: URLRequest.CachePolicy.reloadIgnoringCacheData, timeoutInterval: 10)
request.httpMethod = method.rawValue
switch method {
case .GET:
if let para = paramates {
for (key, value) in para {
if i == 0 {
urlString += "?\(key)=\(value)"
}else {
urlString += "&\(key)=\(value)"
}
i += 1
}
}
request.url = URL.init(string: urlString)
break
case .POST:
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
do {
let para:Data = try JSONSerialization.data(withJSONObject: paramates!, options: JSONSerialization.WritingOptions.prettyPrinted)
request.httpBody = para
}catch {
}
break
default:
print(" ")
break
}
session.dataTask(with: request, completionHandler: { (data, response, error) in
if error == nil {
result(data!, response, error)// oc block
}else {
print(" ")
return
}
}).resume()
}
이것이 바로 제가 쓴 간단한 네트워크 요청 클래스입니다. 테이블뷰로 데이터를 보여줄 때 요청 데이터가 추가된 후에 모델이 그룹에 추가되었고 당신도 그 다음에 Reloaddata를 썼지만 결과가 없습니다. 클릭하거나 당기면 결과가 나타납니다. 이렇게 쓰세요.
self?.data_ary.append(model)
self?.tb.reloadData()
이 결과를 초래한 원인은 URLSession이 비동기적으로 실행했기 때문이다. 비동기 함수가 실제로 실행되기 시작했을 때 이 함수는 되돌아왔다. 그러나 탈출 클립은 비동기적으로 실행된 후에 이 클립이 되돌아온다. 네가 이렇게 쓰는 것은 사실 안 쓴 것과 같다. 테이블뷰는 데이터를 새로 고치지 않는다. 가장 간단한 방법은 이 새로 고침 조작을 주 라인에 쓰는 것이다. 이렇게 하는 것이다.
DispatchQueue.main.async {
self?.tb.reloadData()
}
이것도 구덩이가 아니지. oc에서 성공을 요청하는 Block에 익숙해졌어. 리로드 다타를 실행해 봐. 여기서 하나만 주의하면 돼.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.