swift 스스로 간이 네트워크 요청을 봉하여 폐쇄된 작은 구덩이에서 탈출

2578 단어
인터넷 요청에 대해 swift 버전의 가장 많은 것은 바로 alamofire입니다. fn의 swift 버전이고git에 상세한 사용법이 있습니다. 여기에 열거하지 않겠습니다. 평소에 인터넷 요청도 이렇게 큰 프레임워크를 사용하지 못합니다. URL Session으로 충분합니다. 스스로 간편한 인터넷 요청을 썼습니다.
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에 익숙해졌어. 리로드 다타를 실행해 봐. 여기서 하나만 주의하면 돼.

좋은 웹페이지 즐겨찾기