2014-10-08 37 views
1

我試圖下載URL文件大小,具備NSURLConnection的 - 斯威夫特

這裏之前得到來自URL的文件大小是OBJ-C代碼

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?' 

我錯過了這裏很快的東西嗎?

回答

3

的響應參數的類型

AutoreleasingUnsafeMutablePointer<NSURLResponse?> 

,這意味着你可以傳遞的可選NSURLResponse作爲參數地址:

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

然後,您可以有條件地轉換返回的響應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) 
})