2015-09-07 62 views
17

不贊成我想下載一個文件,一個NSURLRequest並保存,但與NSURLConnection的在iOS9

NSData * data = ...行發生錯誤。

NSURL *Urlstring = [NSURL URLWithString:@"http://yourdomain.com/yourfile.pdf"]; 
NSURLRequest *request = [NSURLRequest requestWithURL: Urlstring]; 
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"]; 

[data writeToURL:documentsURL atomically:YES]; 

警告消息是,我應該使用NSURLSession dataTaskwithrequest「因爲sendSynchronousRequest在iOS的9棄用但是,這並不工作,我希望有人能幫助我

+2

「已棄用」不是錯誤。這是一個警告,未來某些事情將會消失。如果你有一個實際的錯誤,這可能是由於不同的原因。 –

+0

Sry you are rigth – Maximilian

回答

32

現在你必須使用NSURLSession

例(GET):

-(void)placeGetRequest:(NSString *)action withHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))ourBlock { 

    NSString *urlString = [NSString stringWithFormat:@"%@/%@", URL_API, action]; 


    NSURL *url = [NSURL URLWithString:urlString]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:ourBlock] resume]; 
} 

現在,您將需要調用該方法包含一個操作(或者您的完整URL,如果您願意的話)以及在API調用返回時將執行的代碼塊。

[self placeGetRequest:@"action" withHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    // your code 
}]; 

內部的塊,你會收到一個NSData響應數據和NSURLResponse與HTTP響應。所以,現在,你可以在那裏把你的代碼:

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"]; 

[data writeToURL:documentsURL atomically:YES]; 

NSURLSession和NSURLConnection的 NSURLConnection的之間

  • 主要區別在於:如果我們有NSURLConnection的和系統的開放連接中斷我們的應用程序,當我們的應用程序進入後臺模式,我們收到或發送的所有內容都已丟失。 Process diagram for NSURLConnection

  • NSURLSession:解決這個問題,也讓我們沒有進程下載。即使我們無法訪問,它也可以管理連接過程。你需要在你的AppDelegate Process diagram for NSURLSession

使用application:handleEventsForBackgroundURLSession:completionHandler因此,與使用NSURLSession的,你不需要管理或檢查 你的互聯網連接,因爲OS會爲你。

+0

好的謝謝,但是我們的Block是什麼說它未申報的標識 – Maximilian

+0

哦,是的!我們的塊是你必須定義的塊。它應該包含您在api調用完成時要執行的源代碼。我將編輯我的答案給你完整的例子 – EnriMR

+0

@Maximilian,現在檢查我的更新答案並在你的項目中測試它 – EnriMR