Indonesian (Bahasa Indonesia) translation by Dean Ramadhan (you can also view the original English article)
Dari perspektif pengembang, salah satu perubahan yang lebih signifikan di iOS 7, dan OS X Mavericks dalam hal ini, adalah pengenalan NSURLSession
. Meskipun NSURLSession
mungkin tampak menakutkan pada pandangan pertama, penting bagi Anda untuk memahami apa itu, bagaimana hubungannya dengan NSURLConnection
, dan apa perbedaannya. Dalam seri ini, saya akan membawa Anda melalui dasar-dasar NSURLSession
sehingga Anda dapat memanfaatkan teknologi baru ini dalam aplikasi Anda sendiri.
Mengapa Mengganti NSURLConnection
?
Pertanyaan pertama yang mungkin Anda tanyakan pada diri Anda adalah mengapa Apple merasa perlu untuk memperkenalkan NSURLSession
sementara kami sangat senang dengan NSURLConnection
. Pertanyaan sebenarnya adalah apakah Anda senang dengan NSURLConnection
. Apakah Anda ingat saat itu Anda mengutuk dan melempar sesuatu ke NSURLConnection
? Sebagian besar pengembang Cocoa berada di tempat itu, itulah sebabnya Apple memutuskan untuk kembali ke papan gambar dan membuat solusi yang lebih elegan, lebih cocok untuk web modern.
Meskipun NSURLSession
dan NSURLConnection
memiliki banyak kesamaan dalam hal cara kerjanya, pada level fundamental, mereka sangat berbeda. Apple menciptakan NSURLSession
menyerupai konsep umum NSURLConnection
, tetapi Anda akan belajar dalam rangkaian seri ini bahwa NSURLSession
modern, lebih mudah digunakan, dan dibangun dengan mempertimbangkan mobile.
Apa itu NSURLSession
?
Sebelum saya membahas perbedaan antara NSURLSession
dan NSURLConnection
, ada baiknya untuk melihat lebih dekat apa itu NSURLSession
. Terlepas dari namanya, NSURLSession
bukan hanya kelas lain yang dapat Anda gunakan dalam aplikasi iOS atau OS X. NSURLSession
adalah teknologi pertama dan terpenting seperti halnya NSURLConnection
.
Sesi adalah Wadah
NSURLSession
dan NSURLConnection
keduanya menyediakan API untuk berinteraksi dengan berbagai protokol, seperti HTTP
dan HTTPS
. Objek session, sebuah instance dari kelas NSURLSession
, adalah apa yang mengelola interaksi ini. Ini adalah wadah yang sangat dapat dikonfigurasi dengan API elegan yang memungkinkan untuk kontrol berbutir halus. Ini menawarkan fitur yang tidak ada di NSURLConnection
. Terlebih lagi, dengan NSURLSession
, Anda dapat menyelesaikan tugas yang sama sekali tidak mungkin dengan NSURLConnection
, seperti menerapkan penelusuran pribadi.
Task
Unit dasar kerja ketika bekerja dengan NSURLSession
adalah task, sebuah instance dari NSURLSessionTask
. Ada tiga jenis task, data task, upload task, dan download task.
- Anda paling sering menggunakan data task, yang merupakan instance dari
NSURLSessionDataTask
. Data task digunakan untuk meminta data dari server, seperti data JSON. Perbedaan utama dengan tugas unggah dan unduh adalah mereka mengembalikan data langsung ke aplikasi Anda daripada melalui sistem file. Data hanya disimpan dalam memori. - Sesuai namanya, upload task digunakan untuk mengunggah data ke tujuan remote.
NSURLSessionUploadTask
adalah subkelas dariNSURLSessionDataTask
dan berperilaku serupa. Salah satu perbedaan utama dengan data task biasa adalah bahwa upload task dapat digunakan dalam sesi yang dibuat dengan konfigurasi sesi latar belakang. - Download task, instance dari
NSURLSessionDownloadTask
, mewarisi langsung dariNSURLSessionTask
. Perbedaan paling signifikan dengan data task adalah bahwa download tas menulis responsnya langsung ke file sementara. Ini sangat berbeda dari data task biasa yang menyimpan respons dalam memori. Dimungkinkan untuk membatalkan download task dan melanjutkannya di lain waktu.
Seperti yang dapat Anda bayangkan, asinkronisitas adalah konsep kunci dalam NSURLSession
. NSURLSession
API mengembalikan data dengan memanggil completion handler atau melalui delegasi sesi. API NSURLSession
dirancang dengan fleksibilitas dalam pikiran karena Anda akan melihat sedikit kemudian dalam tutorial ini.
Bertemu dengan keluarga
Seperti yang saya sebutkan sebelumnya, NSURLSession
adalah sebuah teknologi dan kelas yang akan Anda tangani. NSURLSession
API menampung sejumlah kelas, tetapi NSURLSession
adalah komponen utama yang mengirim permintaan dan menerima tanggapan. Konfigurasi objek session, bagaimanapun, ditangani oleh turunan dari kelas NSURLSessionConfiguration
. Kelas NSURLSessionTask
dan tiga subkelas konkretnya adalah worket dan selalu digunakan bersama dengan sesi karena itu adalah sesi yang membuat objek task.
Delegasi
Baik NSURLSession
dan NSURLConnection
sangat bergantung pada pola delegasi. Protokol NSURLSessionDelegate
menyatakan beberapa metode delegasi untuk menangani event di level session. Selain itu, kelas dan subkelas NSURLSessionTask
masing-masing menyatakan protokol delegasi untuk menangani event level task.
Teman-teman lama
NSURLSession
API dibangun di atas kelas yang sudah Anda kenal, seperti NSURL
, NSURLRequest
, dan NSURLResponse
.
Apa perbedaannya?
Apa perbedaan NSURLSession
dengan NSURLConnection
? Ini adalah pertanyaan penting, karena NSURLConnection
tidak ditinggalkan oleh Apple. Anda masih dapat menggunakan NSURLConnection
di proyek Anda. Mengapa Anda harus menggunakan NSURLSession
?
Hal pertama yang harus dipahami adalah bahwa instance NSURLSession
adalah objek yang mengelola permintaan dan respons. Ini mirip dengan cara kerja NSURLConnection
, tetapi perbedaan utama adalah bahwa konfigurasi permintaan ditangani oleh objek session, yang merupakan objek berumur panjang. Ini dilakukan melalui kelas NSURLSessionConfiguration
. Tidak hanya menyediakan konfigurasi NSURLSession
API halus melalui kelas NSURLSessionConfiguration
, itu mendorong pemisahan data (body permintaan) dari metadata. NSURLSessionDownloadTask
mengilustrasikan hal ini dengan baik dengan langsung menulis respons ke sistem file.
Otentikasi lebih mudah dan ditangani lebih elegan oleh NSURLSession
. NSURLSession
API menangani otentikasi berdasarkan koneksi daripada atas dasar permintaan, seperti yang dilakukan NSURLConnection
. NSURLSession
API juga membuatnya lebih mudah untuk menyediakan opsi HTTP dan setiap sesi dapat memiliki wadah penyimpanan terpisah tergantung pada bagaimana Anda mengkonfigurasi sesi.
Dalam pendahuluan, saya katakan bahwa NSURLSession
menyediakan antarmuka modern, yang terintegrasi dengan anggun dengan iOS 7. Salah satu contoh integrasi ini adalah unggahan dan unduhan NSURLSession
yang tidak diproses. NSURLSession
dioptimalkan untuk menghemat masa pakai baterai, mendukung penghentian sementara, pembatalan, dan dilanjutkannya task serta API multitasking UIKit. Apa yang tidak disukai dari NSURLSession
?
Membuat Kaki Anda Basah
Langkah 1: Pengaturan Proyek
API baru paling baik dipelajari dengan berlatih jadi ini saatnya untuk menyalakan Xcode dan membuat kaki kita basah. Luncurkan Xcode 5, buat proyek baru dengan memilih New > Project ... dari menu File, dan pilih templat Single View Application dari daftar templat aplikasi iOS.



Beri nama proyek Anda, beri tahu Xcode tempat Anda ingin menyimpannya, dan tekan Create. Tidak perlu menempatkan proyek di bawah source control.



Langkah 2: Membuat Obyek Session
Ketika bekerja dengan NSURLSession
, penting untuk memahami bahwa objek session, sebuah instance dari NSURLSession
, adalah pemain bintang. Ini menangani permintaan dan respons, mengonfigurasi permintaan, mengelola penyimpanan dan status sesi, dll. Membuat sesi dapat dilakukan beberapa cara. Cara tercepat untuk memulai adalah dengan menggunakan metode kelas sharedSession
NSURLSession
seperti yang ditunjukkan di bawah ini.
- (void)viewDidLoad { [super viewDidLoad]; NSURLSession *session = [NSURLSession sharedSession]; }
Buat objek session
dalam metode viewDidLoad
view controller seperti yang ditunjukkan di atas. Objek session
yang kami buat baik-baik saja untuk contoh kami, tetapi Anda mungkin ingin sedikit lebih fleksibel dalam kebanyakan kasus. Objek session
yang baru saja kita buat menggunakan global NSURLCache
, NSHTTPCookieStorage
, dan NSURLCredentialStorage
. Ini berarti bahwa ia bekerja sangat mirip dengan implementasi standar NSURLConnection
.
Langkah 3: Membuat Data Task
Untuk menempatkan objek session
untuk digunakan, mari kita query API Pencarian iTunes Store dan mencari perangkat lunak yang dibuat oleh Apple. API Pencarian iTunes Store mudah digunakan dan tidak memerlukan otentikasi, yang membuatnya ideal untuk contoh kita.
Untuk kueri API pencarian, kami perlu mengirim permintaan ke https://itunes.apple.com/search
dan masukan beberapa parameter. Seperti yang kita lihat sebelumnya, saat menggunakan NSURLSession
API, permintaan diwakili oleh task. Untuk kueri pencarian API, yang kita butuhkan adalah data task , instance dari kelas NSURLSessionDataTask
. Lihatlah implementasi viewDidLoad
yang diperbarui seperti yang ditunjukkan di bawah ini.
- (void)viewDidLoad { [super viewDidLoad]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=apple&media=software"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"%@", json); }]; }
Ada sejumlah metode yang tersedia untuk membuat task, tetapi konsep kunci untuk dipahami adalah bahwa objek session
melakukan pembuatan dan konfigurasi task yang sebenarnya. Dalam contoh ini, kami memanggil dataTaskWithURL:completionHandler
: dan meneruskannya sebuah instance dari NSURL
dan juga completion handler. Completion handler menerima tiga argumen, data raw dari respons (NSData
), objek respons (NSURLResponse
), dan objek kesalahan (NSError
). Jika permintaan berhasil, objek error adalah nil
. Karena kami tahu permintaan mengembalikan respons JSON, kami membuat objek Foundation dari objek data
yang kami terima dan mencatat hasilnya ke konsol.
Penting untuk dipahami bahwa objek error
yang dimasukan ke completion handler hanya diisi, bukan nil
, jika permintaan gagal atau mengalami kesalahan. Dengan kata lain, jika permintaan mengembalikan respons 404
, permintaan itu berhasil sejauh sesi yang bersangkutan. Objek error
kemudian akan menjadi nil
. Ini adalah konsep penting untuk dipahami ketika bekerja dengan NSURLSession
dan NSURLConnection
dalam hal ini.
Bangun proyek dan jalankan aplikasi di Simulator iOS atau pada perangkat fisik, dan periksa Konsol Xcode. Tidak ada yang dicetak ke konsol. Apa yang salah? Seperti yang saya sebutkan sebelumnya, NSURLSession
API mendukung penghentian, pembatalan, dan melanjutkan task atau permintaan. Perilaku ini mirip dengan NSOperation
dan mungkin mengingatkan Anda tentang pustaka AFNetworking. Task memiliki properti state
yang menunjukkan apakah task sedang berjalan (NSURLSessionTaskStateRunning
), ditangguhkan (NSURLSessionTaskStateSuspended
), membatalkan (NSURLSessionTaskStateCanceling
), atau selesai (NSURLSessionTaskStateCompleted
). Ketika objek session membuat task, tugas memulai kehidupannya dalam status ditangguhkan. Untuk memulai task, kita perlu mengatakannya untuk melanjutkan
dengan memanggil resume
pada task. Perbarui metode viewDidLoad
seperti yang ditunjukkan di bawah ini, jalankan aplikasi sekali lagi, dan periksa output di konsol. Misi selesai.
- (void)viewDidLoad { [super viewDidLoad]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=apple&media=software"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"%@", json); }]; [dataTask resume]; }
Mengunduh Sumber Daya Remote
Pada contoh sebelumnya, kami menggunakan completion handler untuk memproses respons yang kami terima dari permintaan. Dimungkinkan juga untuk mencapai hasil yang sama dengan mengimplementasikan protokol delegasi task. Mari kita lihat apa yang diperlukan untuk mengunduh gambar dengan memanfaatkan NSURLSession
dan NSURLSessionDownloadTask
.
Langkah 1: Membuat Antarmuka Pengguna
Buka MTViewController.h
dan buat dua outlet seperti yang ditunjukkan di bawah ini. Kami akan menggunakan outlet pertama, instance dari UIImageView
, untuk menampilkan gambar yang diunduh ke pengguna. Outlet kedua, sebuah instance dari UIProgressView
, akan menunjukkan download task.
#import <UIKit/UIKit.h> @interface MTViewController : UIViewController @property (weak, nonatomic) IBOutlet UIImageView *imageView; @property (weak, nonatomic) IBOutlet UIProgressView *progressView; @end
Buka storyboard utama proyek (Main.storyboard), seret instance UIImageView
ke tampilan view controller, dan sambungkan outlet view controller yang baru saja kita buat di file header view controller. Ulangi proses ini untuk tampilan kemajuan.



Langkah 2: Membuat Download Task
Dalam contoh ini, kami tidak akan menggunakan metode kelas sharedSession
, karena kami perlu mengonfigurasi objek session
yang akan kami gunakan untuk membuat permintaan. Perbarui implementasi viewDidLoad
seperti yang ditunjukkan di bawah ini.
- (void)viewDidLoad { [super viewDidLoad]; NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:[NSURL URLWithString:@"http://cdn.tutsplus.com/mobile/uploads/2013/12/sample.jpg"]]; [downloadTask resume]; }
Untuk mencegah peringatan kompiler muncul, pastikan untuk menyesuaikan kelas MTViewController
ke protokol NSURLSessionDelegate
dan NSURLSessionDownloadDelegate
seperti yang ditunjukkan di bawah ini.
#import "MTViewController.h" @interface MTViewController () <NSURLSessionDelegate, NSURLSessionDownloadDelegate> @end
Di viewDidLoad
, kami membuat instance kelas NSURLSessionConfiguration
dengan memanggil metode kelas defaultSessionConfiguration
. Seperti yang dinyatakan dalam dokumentasi, dengan menggunakan konfigurasi sesi default, sesi akan berperilaku seperti instance NSURLConnection
dalam konfigurasi default, yang tidak apa-apa untuk contoh kita.
Dalam contoh ini, kami membuat instance NSURLSession
dengan menjalankan metode kelas sessionWithConfiguration:delegate:delegateQueue
dan meneruskan objek sessionConfiguration
yang kami buat beberapa saat yang lalu. Kami menetapkan view controller sebagai delegasi session dan memberikan nil
sebagai argumen ketiga. Anda dapat mengabaikan argumen ketiga untuk saat ini. Perbedaan utama dengan contoh sebelumnya adalah bahwa kita menetapkan delegasi session
ke view controller.
Untuk mengunduh gambar, kita perlu membuat download task. Kami melakukan ini dengan memanggil downloadTaskWithUR:
pada objek session
, memasukan sebuah instance NSURL
, dan memanggil resume
pada download task. Kami bisa menggunakan completion handler seperti yang kami lakukan sebelumnya, tapi saya ingin menunjukkan kepada Anda kemungkinan menggunakan delegasi.
Langkah 3: Implementasi Protokol Delegasi
Untuk membuat semua pekerjaan ini, kita perlu menerapkan tiga metode delegasi dari protokol NSURLSessionDownloadDelegate
, URLSession:downloadTask:didFinishDownloadingToURL
:, URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes
:, dan URLSession:downloadTask:downloadTaskdidWriteData:totalBytesWritten:totalBytesExpectedToWrite
Implementasi masing-masing metode cukup mudah. Penting untuk dicatat bahwa kita perlu memperbarui antarmuka pengguna pada thread utama menggunakan GCD (Grand Central Dispatch). Dengan melewati nil
sebagai argumen ketiga dari sessionWithConfiguration:delegate:delegateQueue
operasi membuat antrian latar belakang untuk kita. Ini baik-baik saja, tetapi itu juga berarti bahwa kita perlu menyadari bahwa metode delegasi dipanggil pada thread latar daripada thread utama. Bangun proyek dan jalankan aplikasi untuk melihat hasil kerja keras kami.
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { NSData *data = [NSData dataWithContentsOfURL:location]; dispatch_async(dispatch_get_main_queue(), ^{ [self.progressView setHidden:YES]; [self.imageView setImage:[UIImage imageWithData:data]]; }); } - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes { } - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { float progress = (double)totalBytesWritten / (double)totalBytesExpectedToWrite; dispatch_async(dispatch_get_main_queue(), ^{ [self.progressView setProgress:progress]; }); }
Kesimpulan
Dengan dua contoh ini, Anda harus memiliki pemahaman dasar tentang dasar-dasar API NSURLSession
, bagaimana perbandingannya dengan NSURLConnection
, dan apa kelebihannya. Pada bagian selanjutnya dari seri ini, kita akan melihat fitur-fitur NSURLSession
yang lebih lanjut.