2017-08-06 89 views
0

將NSURLConnection轉換爲NSURLSession的最佳方式是什麼?從NSURLConnection到NSURLSession

錯誤消息:(Xcode中)

ViewController.m:342:45: 'stringByAddingPercentEscapesUsingEncoding:' 被棄用:在IOS 9.0第一棄用 - 使用-stringByAddingPercentEncodingWithAllowedCharacters:代替,它總是使用推薦的UTF- 8編碼,並且針對特定的URL組件或子組件編碼,因爲每個URL組件或子組件對於哪些字符有效具有不同的規則。

我的代碼:

-(void)downloadZip 
{ 
    NSLog(@"Start Downloading Zip File"); 

    NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"LastUpdate"]; 


    NSString *path = [NSString stringWithFormat:phpLinkgetZip, myDate]; 

    NSURL *url = [NSURL URLWithString:[path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

    NSLog(@"Checking update at Zip File : %@", path); 
    NSLog(@"Checking update Time : %@", myDate); 


    responseData = [[NSMutableData alloc] init]; 


    NSURLRequest* updateRequest = [NSURLRequest requestWithURL: url]; 

    NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:updateRequest delegate:self]; 
    [connection start]; 

    NSLog(@"Zip Downloading start..."); 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [responseData setLength:0]; 
    filesize = [[NSNumber numberWithLong: [response expectedContentLength] ] retain]; 

} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    [self updateZipDownloaded]; 
    [filesize release]; 
    [connection release]; 

} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [responseData appendData:data]; 
    NSNumber* curLength = [NSNumber numberWithLong:[responseData length] ]; 
    float progress = [curLength floatValue]/[filesize floatValue] ; 


} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"Zip Downloading error"); 

} 
+1

@phl_Austria這可能幫助你 - :https://www.objc.io/issues/5-ios7/from-nsurlconnection-to-nsurlsession/ –

+0

顯示updateZipDownloaded方法的代碼。 – user3182143

+0

檢查我的答案。它可以幫助你。 – user3182143

回答

1

如果你想克服上述錯誤,請使用以下代碼

NSCharacterSet *setPath = [NSCharacterSet URLPathAllowedCharacterSet]; 
NSString *strURL = [path stringByAddingPercentEncodingWithAllowedCharacters:setPath]; 

stringByAddingPercentEncodingWithAllowedCharacters:

返回從接收器做了一個新的字符串替換所有 中的字符不在指定的具有百分比編碼字符的集合。

性狀傳遞給設置爲低於方法

  • (NSCharacterSet *)URLUserAllowedCharacterSet;
  • (NSCharacterSet *)URLPasswordAllowedCharacterSet;
  • (NSCharacterSet *)URLHostAllowedCharacterSet;
  • (NSCharacterSet *)URLPathAllowedCharacterSet;
  • (NSCharacterSet *)URLQueryAllowedCharacterSet;
  • (NSCharacterSet *)URLFragmentAllowedCharacterSet;

如果你想從NSURLConnetion去NSURLSession,做以下事情

NSURL *URL = [NSURL URLWithString:@"http://example.com"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 

NSURLSession *session = [NSURLSession sharedSession]; 
NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
            completionHandler: 
^(NSData *data, NSURLResponse *response, NSError *error) { 
    // ... 
}]; 

[task resume]; 

NSURLSession類和相關類通過HTTP下載內容的API。此API提供了一組豐富的委託方法來支持身份驗證,並使您的應用能夠在您的應用未運行時執行後臺下載,或者在iOS中暫停您的應用時執行後臺下載。

要使用NSURLSession API,您的應用程序會創建一系列會話,其中每個會話都會協調一組相關的數據傳輸任務。例如,對於 示例,如果您正在編寫Web瀏覽器,則您的應用程序可能會爲每個選項卡或窗口創建一個 會話。在每個會話中,您的應用程序會添加一系列 任務,其中每個任務表示對特定URL的請求(如果原始URL返回HTTP重定向,則表示任何後續URL的 )。

與大多數網絡APIs一樣,NSURLSession API的異步性非常高,爲 。如果您使用系統提供的默認代理,則您的 必須提供完成處理程序塊,以便在傳輸成功完成或發生錯誤時將數據返回到您的應用程序 。或者,如果您提供自己的自定義委託對象,則任務對象將調用 這些委託人的方法以及從服務器 (或對於文件下載,當傳輸完成時)收到的數據。

相關問題