2014-10-08 2 views
1

스위프트는 OBJ-C 코드URL 파일 크기 - 내가 여기 <p></p>을 다운로드하기 전에 URL에서 파일 크기를 얻기 위해 노력하고

NSURL *URL = [NSURL URLWithString:"ExampleURL"]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; 
    [request setHTTPMethod:@"HEAD"]; 
    NSHTTPURLResponse *response; 
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: nil]; 
    long long size = [response expectedContentLength]; 

이며, 여기 스위프트 코드를입니다

var url:NSURL = NSURL(string: "ExmapleURL") 
       var request:NSMutableURLRequest = NSMutableURLRequest(URL: url) 
       request.HTTPMethod = "HEAD" 
       var response = NSHTTPURLResponse() 
       NSURLConnection.sendSynchronousRequest(request, returningResponse: &response , error: nil) 

여기에 오류가 있습니다.

NSURLConnection.sendSynchronousRequest(request, returningResponse: &response , error: nil) 

'NSHTTPURLResponse' is not identical to 'NSURLResponse?' 

내가 여기서 빠져 나왔어?

var response : NSURLResponse? 
NSURLConnection.sendSynchronousRequest(request, returningResponse: &response , error: nil) 

당신은 다음 조건에 반환 된 응답을 캐스팅 할 수 있습니다

답변

3

응답 매개 변수는 인자로 선택NSURLResponse의 주소를 전달할 수 있다는 것을 의미 유형

AutoreleasingUnsafeMutablePointer<NSURLResponse?> 

있다 a NSHTTPURLResponse :

if let httpResponse = response as? NSHTTPURLResponse { 
    println(httpResponse.expectedContentLength) 
} 

반환 값이 sendSynchronousRequest()인지 확인해야하는데, 연결이 이루어지지 않으면 은 nil입니다.

또한 연결 하기 위해 시간이 걸릴 수 있기 때문에 만 별도의 스레드에서이 메소드를 호출 (또는 대신 sendAsynchronousRequest() 사용) 을하는 것이 좋습니다

- 셀룰러 네트워크를 사용하는 경우, 특히이 - 메인 스레드는 것 그렇지 않으면 이 (가) 차단됩니다.

0

스위프트 4 솔루션 :

func fetchContentLength(for url: URL, completionHandler: @escaping (_ contentLength: Int64?) ->()) { 

    var request = URLRequest(url: url) 
    request.httpMethod = "HEAD" 

    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in 
    guard error == nil, let response = response as? HTTPURLResponse, let contentLength = response.allHeaderFields["Content-Length"] as? String else { 
     completionHandler(nil) 
     return 
    } 
     completionHandler(Int64(contentLength)) 
    } 

     task.resume() 
} 

// Usage: 

let url = URL(string: "https://s3.amazonaws.com/x265.org/video/Tears_400_x265.mp4")! 

fetchContentLength(for: url, completionHandler: { contentLength in 
    print(contentLength ?? 0) 
})