Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. iOS SDK

iOS SDK: Lanjiutan pengembangan RestKit

by
Difficulty:AdvancedLength:LongLanguages:
This post is part of a series called Developing RESTful iOS Apps with RestKit.
Developing RESTful iOS Apps with RestKit

Indonesian (Bahasa Indonesia) translation by Johari Triana (you can also view the original English article)

Pada artikel ini kami akan terus kami eksplorasi RestKit, framework iOS untuk bekerja dengan layanan web. Hal ini diasumsikan bahwa pembaca telah membaca bagian I dan memiliki pengetahuan dari RestKit. Membangun di atas dasar yang kita didirikan perkenalan, kita akan memeriksa kemampuan canggih Perpustakaan dan belajar bagaimana untuk mempercepat upaya pengembangan iOS.

Apa yang akan dibahas?

  • Networking lanjutan: Reachability, Multi-part requests, permintaan antrian dan background proses upload/download semua dibahas.
  • Advanced Object Mapping: Coding key-value pemetaan hubungan.
  • Core Data: Integrasi antara mapper objek dan Apple Core Data persistence framework dibahas panjang lebar. Ini termasuk konfigurasi, manajemen hubungan, seeding database, dll.
  • Integration Layaer: Kita akan secara singkat menyentuh pada titik-titik integrasi yang terkena oleh perpustakaan untuk bekerja dengan Ruby di Rails backend dan interaksi dengan Facebook Three20 framework.

Pendamping contoh kode

Untuk membantu pembaca dalam mengikuti konsep-konsep yang disajikan di sini, aplikasi contoh yang menyertainya disediakan dengan distribusi RestKit. Setiap bagian dari tutorial akan mengarahkan Anda ke sebuah contoh khusus dalam contoh RKCatalog, ditemukan dalam direktori RestKit/Examples/RKCatalog.

Pada saat penulisan ini, RestKit sedang Versi 0.9.2. Perpustakaan sumber dan contoh kode dapat didownload dari halaman download RestKit.

Networking Lanjutan

Kami telah memperkenalkan ke pemain kunci dalam RestKi Network Layer: RKClient, RKRequest dan RKResponse. ketiga class ini menyediakan sederhana, clean API untuk membuat permintaan untuk layanan web remote. Dalam bagian ini kita akan melihat bagaimana RestKit scale berdiri ketika segala sesuatunya menjadi lebih rumit.

Permintaan serialisasi: di belakang layar

Dalam pengantar network layer, kita belajar untuk menggunakan RestKit untuk mengirimkan permintaan menggunakan get, post, put dan delete metode. Metode ini abstrak menjauh rincian membangun URL lengkap, membangun request, mempopulasikan body permintaan dan asynchronously mengirim permintaan.

Kita juga belajar bagaimana meng-embed parameter ke permintaan kami dengan menyediakan NSDictionary pairs key/value. Di belakang layar, RestKit mengambil dictionary ini dan konstruksi URL dikodekan HTTP body untuk melampirkan ke atas permintaan. Header Content-Type diatur ke 'application/x-www-form-urlencoded' dan permintaan yang dikirim untuk diproses. Ini merupakan kemudahan yang besar atas harus membangun body permintaan diri kita sendiri dan itu dukungan ini yang membentuk dasar mapper objek.

Tapi bagaimana dengan permintaan yang tidak boleh diwakili oleh dictionary atau dimuat ke memori semua sekaligus? Kita harus melihat melampaui kesederhanaan yang diberikan oleh NSDictionary dan lihatlah dua entitas baru: RKRequestSerializable dan RKParams.

Meskipun kita sering menggunakan NSDictionary mewakili parameter untuk banyak dari permintaan kami, RestKit tidak secara khusus memberkati NSDictionary. Jika Anda melihat signature metode RKRequest's params argumen, Anda akan perhatikan bahwa tidak menjelaskan NSDictionary sama sekali. Sebaliknya Anda akan melihat:

Perhatikan protokol RKRequestSerializable di sini. RKRequestSerializable mendefinisikan sebuah protokol sangat ringan yang memungkinkan arbitrary class untuk searialize sendiri untuk digunakan dalam body RKRequest. Bila Anda mengimpor RestKit, ia menambahkan kategori NSDictionary menyediakan implementasi protokol RKRequestSerializable. RKRequestSerializable mendefinisikan hanya beberapa metode yang Anda harus menerapkan untuk membuat setiap jenis objek serializable:

  • HTTPHeaderValueForContentType - metode ini mengembalikan nilai NSString untuk digunakan sebagai header Content-Type untuk request. Untuk NSDictionary, kami encode key/value menggunakan bentuk pengkodean dan mengembalikan ' application/x-www-form-urlencoded' untuk metode ini.
  • HTTPHeaderValueForContentLength - ini opsional metode mengembalikan nilai NSUInteger untuk digunakan sebagai header Content-Length untuk permintaan. Hal ini berguna dalam long-running upload permintaan untuk tujuan pelacakan progress.
  • HTTPBody - metode ini mengembalikan sebuah objek NSData yang berisi data yang ingin Anda kirim sebagai body request. Untuk NSDictionary, kami berjalan melalui key/value pair dan membangun string URL dikodekan. String ini kemudian dipaksa NSData dengan menggunakan NSUTF8StringEncoding encoding. Metode ini opsional, jika Anda memberikan sebuah implementasi dari HTTPBodyStream (lihat bawah).
  • HTTPBodyStream - metode ini mengembalikan sebuah objek NSStream yang harus digunakan untuk membaca data untuk digunakan dalam body request. HTTPBodyStream akan berkonsultasi sebelum HTTPBody selama konstruksi request. HTTPBodyStream dapat digunakan untuk memberikan dukungan untuk meng-upload file yang ada pada disk atau terlalu besar untuk masuk ke dalam memori utama. RestKit akan efisien stream data dari disk dan mengirimkannya untuk pemrosesan.

RKParams: Mengirim Multi-part requests

Sekarang bahwa kita memahami bagaimana RestKit coerces objek serializable representasi, kita dapat melihat pelaksanaan RKRequestSerializable yang dimasukan dengan perpustakaan yang lain: RKParams. RKParams menyediakan antarmuka yang sederhana untuk membangun lebih kompleks multi-part requests. Anda dapat menganggap RKParams sebagai sebuah implementasi dictionary HTTP-aware. Selain menyediakan objek yang sederhana untuk nilai-nilai parameter kami, RKParams juga memungkinkan kami untuk menyediakan NSData dan path ke file pada disk. Kami juga dapat menetapkan nama file dan MIME jenis setiap parameter secara individual. Untuk menggambarkan bagaimana ini bekerja, mari kita lihat beberapa kode:

Pada dasarnya apa yang kita lakukan di sini adalah menciptakan tumpukan objek RKParamsAttachment yang terkandung dalam contoh RKParams. Dengan setiap panggilan untuk setValue, setFile, atau setData kami instantiating sebuah instance baru dari RKParamsAttachment dan menambahkannya ke tumpukan. Masing-masing metode ini mengembalikan objek RKParamsAttachment yang telah menciptakan bagi Anda sehingga Anda dapat lebih lanjut menyesuaikan jika perlu. Kita melihat ini digunakan untuk mengatur properti MIMEType dan fileName untuk gambar. Ketika kita menetapkan objek params ke RKRequest, serial ke dalam dokumen multipart/form-data dan dibaca sebagai stream oleh NSURLConnection. Perilaku ini streaming memungkinkan RKParams digunakan untuk membaca file yang sangat besar dari disk tanpa melelahkan memori pada perangkat iOS.

Contoh kode - RKParamsExample lihat di RKCatalog

Request Queue

Sementara Anda telah dengan senang hati mengirim request dan pengolahan tanggapan dengan RKClient, RKRequest dan RKResponse bagian lain dari RestKit telah beroperasi diam-diam di belakang layar, tanpa sepengetahuan Anda: RKRequestQueue. Request Queue dukungan penting pemain di dunia RestKit dan menjadi semakin penting sebagai aplikasi Anda tumbuh dalam lingkup. RKRequestQueue memiliki tiga tanggung jawab utama: mengelola permintaan memori, memastikan jaringan tidak mendapatkan permintaan terlalu terbebani, dan mengelola siklus hidup.

Memori manajemen dapat menjadi sangat melelahkan dalam aplikasi kakao, karena begitu banyak bekerja terjadi asynchronously. RestKit adalah semua tentang mengurangi kompleksitas dan upacara yang terkait dengan bekerja dengan layanan web dalam Cocoa dan dengan demikian menyediakan RKRequestQueue bergeser keprihatinan manajemen memori dari pengembang aplikasi dan ke dalam framework. Ingat apa RestKit request/response khas seperti:

Perhatikan bahwa tidak ada satu panggilan untuk mempertahankan, rilis atau autorelease di mana saja di mata. Ini adalah tempat antrian permintaan datang bermain. Ketika kita meminta untuk mengirim sebuah objek RKRequest, itu tidak segera dikirim. Sebaliknya ini adalah dipertahankan oleh RKRequestQueue sharedQueue contoh dan dikirim sesegera mungkin. RestKit watches untuk pemberitahuan yang dihasilkan oleh RKRequest & RKResponse dan rilis yang tahan atas permintaan setelah proses telah selesai. Hal ini memungkinkan kita untuk bekerja dengan layanan web dengan sedikit pemikiran tentang manajemen memori.

Selain mempertahankan & melepaskan RKRequest instance, RKRequestQueue juga berfungsi sebagai juru dengan akses jaringan itu sendiri. Ketika aplikasi pertama kali diluncurkan atau kembali dari background state, RestKit menggunakan integrasi dengan sistem konfigurasi Reachability API untuk menentukan apakah akses jaringan tersedia. Ketika berbicara dengan server remote oleh hostname, ada penundaan antara peluncuran dan penentuan ketersediaan jaringan. Selama waktu ini, RestKit dalam keadaan tak tentu reachability dan RKRequestQueue akan menunda mengirim permintaan sampai reachability jaringan dapat ditentukan. Setelah reachability ditentukan, RKRequestQueue mencegah jaringan dari menjadi terbebani dengan membatasi jumlah permintaan bersamaan ke lima.

Setelah Anda antarmuka pengguna mulai mencakup beberapa controller dan pengguna menavigasi tumpukan controller dengan cepat, Anda dapat mulai menghasilkan jumlah permintaan yang tidak perlu diselesaikan karena pengguna telah menolak view. Di sini kita beralih ke RKRequestQueue juga. Mari kita bayangkan bahwa kita memiliki controller yang segera mulai loading beberapa data ketika muncul tampilan. Tetapi controller juga memiliki beberapa tombol yang pengguna dapat dengan cepat mengakses untuk mengubah perspektif, membuat permintaan kami menendang tidak lagi menarik. Kita dapat baik berpegang pada contoh-contoh RKRequest bahwa kita menghasilkan atau kita dapat membiarkan RKRequestQueue melakukan pekerjaan untuk kami. Mari kita lihat bagaimana ini akan bekerja:

Daripada mengelola permintaan diri kita sendiri dan melakukan pembersihan, kita bisa meminta RKRequestQueue untuk membatalkan permintaan apapun yang kita delegasi. Jika ada tidak ada proses, tidak ada tindakan akan diambil.

Contoh singleton sharedQueue dibuat untuk Anda saat inisialisasi framework. Hal ini juga memungkinkan untuk membuat tambahan ad hoc antrian untuk mengelola kelompok request
lebih granularly. Sebagai contoh, antrian ad hoc dapat berguna untuk men-download atau meng-upload konten di background, sementara menjaga antrian bersama utama bebas untuk menanggapi tindakan pengguna. Mari kita lihat sebuah contoh menggunakan antrian ad hoc:

Dalam contoh ini, kami telah menciptakan antrian ad hoc yang mengirimkan satu permintaan pada waktu dan sistem jaringan aktivitas indikator berputar. Ada sejumlah metode delegasi yang tersedia untuk request queue untuk memudahkan mengelola kelompok reques. Check out contoh RKRequestQueue di RKCatalog untuk contoh-contoh rinci.

Contoh kode - RKRequestQueueExample lihat di RKCatalog

Reachability

Sebagai pengembang iOS, salah satu realitas mengganggu kita menghadapi dan harus berurusan dengan adalah bahwa konektivitas intermiten. Sebagai pengguna kami bergerak di seluruh dunia mereka dengan aplikasi kami, konektivitas dijamin untuk datang dan pergi. Coding untuk kenyataan ini dapat menyulitkan logika kami dan mendistorsi maksud dalam kode kita dengan logika bersyarat.

Untuk membuat keadaan menjadi lebih buruk, SCReachability API yang tersedia bagi kita untuk memantau status jaringan diimplementasikan sebagai low level C API. Untuk membantu meringankan beban ini dan menyediakan platform untuk fungsionalitas high level, RestKit datang dengan bungkus dengan low level SCReachability API di: RKReachabilityObserver.

RKReachabilityObserver abstrak dari SCReachability C API dan sebaliknya menyajikan Objective-C sangat lurus ke depan antarmuka untuk menentukan status jaringan. Mari kita lihat beberapa kode:

Sekarang bahwa kita telah melihat bagaimana untuk menginisialisasi dan bekerja dengan RKReachabilityObserver, perlu dicatat bahwa sebagian besar waktu kita tidak perlu! Ketika Anda menginisialisasi RKClient atau RKObjectManager dengan URL dasar, RestKit pergi ke depan dan menginisialisasi instance RKReachabilityObserver yang ditargetkan pada nama host yang ditentukan dalam URL dasar. Observer ini tersedia bagi Anda melalui properti baseURLReachabilityObserver di RKClient. RKReachabilityObserver juga emit notification setiap kali perubahan jaringan state. Biasanya event ini adalah semua yang Anda tertarik. Mengamati event reachability itu mudah:

Contoh kode - RKReachabilityExample lihat di RKCatalog

Kita akan menjelajahi bagaimana RestKit memanfaatkan Reachability secara internal untuk memberikan akses offline transparan dalam Core Data Object bagian caching.

Background proses Upload/Download

Dengan iOS 4,0, Apple memperkenalkan multi-tasking dukungan untuk aplikasi. Dukungan multi-tasking yang bergantung pada menempatkan aplikasi ke state background, dimana mereka dapat dipulihkan dengan cepat ke mode penuh interaktif, tetapi tidak mengkonsumsi sumber daya sementara di background. Hal ini dapat menimbulkan masalah untuk aplikasi jaringan seperti yang dibangun dengan RestKit: long-running request yang penting dapat terganggu oleh pengguna beralih dari app. Untungnya apel juga disediakan dukungan terbatas untuk memperpanjang kehidupan proses Anda dengan menciptakan background task menggunakan metode beginBackgroundTaskWithExpirationHandler pada UIApplication. Metode ini menerima sebuah blok Objective-C dan mengembalikan nilai UIBackgroundTaskIdentifier untuk background task yang telah dibuat. harus diambil ketika membuat backgroudn task sehingga kompatibilitas dengan iOS 3.0 deployment dijaga.

RestKit berusaha untuk meringankan beban ini pengembang dengan menyediakan dukungan sederhana, transparan untuk background task selama siklus permintaan. Mari kita lihat beberapa kode:

Kebijakan default adalah RKRequestBackgroundPolicyNone. Setelah Anda telah menetapkan kebijakan Anda dan mengirim permintaan Anda, RestKit menangani sisanya — beralih masuk dan keluar dari app akan menyebabkan tindakan yang sesuai untuk terjadi.

Contoh kode - RKBackgroundRequestExample lihat di RKCatalog

Advanced Object Mapping

Pada bagian salah satu seri kami, kami memperkenalkan Object Mapping — proses RestKit untuk mengubah muatan JSON menjadi local domain object. Dalam bentuk yang paling sederhana, Object Mapping mengurangi kebosanan terkait dengan parsing bidang sederhana dari sebuah dictionary dan menugaskan mereka untuk objek target. Tapi itu bukan akhir dari cerita untuk mapper objek.

RestKit juga menyediakan dukungan untuk pemetaan hirarki objek yang diungkapkan melalui hubungan. Ini adalah fitur yang kuat untuk mengimpor data melalui single request HTTP dalam jumlah besar. Dalam bagian ini kita akan mengeksplorasi hubungan pemetaan secara rinci dan melihat bagaimana RestKit mendukung struktur JSON non-idiomatik melalui coding key-value.

Berurusan dengan struktur JSON alternatif

Hampir semua contoh pemetaan objek yang kita telah meneliti sejauh ini telah dilakukan pemetaan sederhana dari satu bidang lain (yaitu created_at menjadi createdAt). Jika Anda memiliki kontrol penuh atas JSON output dari sistem backend atau persis pemodelan output sisi server, hal ini mungkin semua yang perlu Anda pernah lakukan. Tapi kadang-kadang realitas kita perlu untuk mengintegrasikan dengan sistem backend tidak cocok begitu rapi dengan view RestKit di dunia. Jika target Anda JSON mengandung bersarang data yang ingin Anda akses tanpa membusuk struktur ke beberapa jenis objek, Anda akan perlu untuk memanfaatkan kekuatan coding key-value dalam pemetaan Anda.

Coding key-value adalah mekanisme untuk mengakses data langsung di cocoa dengan menggunakan string yang berisi nama properti, daripada menerapkan metode aksesor atau langsung mengakses variabel instan. Coding key-value adalah salah satu pola yang paling penting di Cocoa dan merupakan dasar dari sistem pemetaan objek RestKit's. Ketika RestKit pertemuan muatan data yang tahu bagaimana menangani, muatan adalah menyerahkan ke parser untuk evaluasi. Parser kemudian mengevaluasi data dan mengembalikan key-value pengkodean compliant representasi data dalam bentuk array, dictionary, dan tipe dasar. Dari sini, objek mapper mulai menganalisis representasi dan menggunakan key-value accesor untuk mengambil data dan menetapkan untuk target objek instance. Setiap kali Anda mendaftar elemen untuk pemetaan class atau menetapkan elemen pemetaan properti, Anda memberikan key-value pengkodean path key yang sesuai untuk menjadi mapper. Ini adalah poin yang penting-Anda memiliki kekuatan penuh dari pola key-value yang Anda inginkan. Misalnya, Anda dapat melintasi grafik objek melalui dot notasi sintaks dan memanfaatkan koleksi operator untuk melakukan actuib pada koleksi dalam payload Anda.

Mari kita lihat beberapa kode untuk mendapatkan pemahaman yang lebih baik pengkodean bagaimana key-value dalam RestKit. Pertimbangkan struktur JSON berikut untuk aplikasi sederhana rekening bank:

Kita akan menggunakan coding key-value untuk mengakses beberapa informasi dalam payload: jumlah transaksi, jumlah rata-rata transaksi, dan kelompok berbeda payees dalam daftar transaksi. Berikut ini adalah model kami:

Sekarang hal-hal semakin menarik. Perhatikan sintaks yang baru dimanfaatkan setelah pemetaan balance didefinisikan. Kami telah menggunakan coding key-value untuk melintasi ke array transaksi dan melakukan operasi pada data. Dari sini, kita melihat penggunaan beberapa key-value collection operator. Operator ini diberikan kepada kita oleh Cocoa dan rinci dalam "Key-Value Coding Programming Guide" tersedia dalam dokumentasi Xcode. Pelajaran kunci di sini adalah untuk mengingat bahwa mapper objek dibangun dengan key-value coding dalam pikiran dan ada daya tembak tambahan yang tersedia di luar sederhana onte-to-one pemetaan.

Mengambil keuntungan dari key-value coding dalam pemetaan Anda menjadi sangat berguna ketika bekerja dengan payload JSON besar, kompleks, yang mana Anda hanya peduli tentang subset dari data. Tapi kadang-kadang kami benar-benar peduli tentang informasi semua yang ekstra-kita hanya berharap itu tersedia dalam format yang lebih mudah diakses. Dalam keadaan ini kita sebaliknya dapat beralih ke penggunaan hubungan pemodelan untuk membantu RestKit mengubah payload data besar menjadi objek graph.

Contoh kode - RKKeyValueMappingExample lihat di RKCatalog

Modeling Relationships

Relationship modeling dinyatakan melalui metode elementToRelationshipMappings pada protokol RKObjectMappable. Metode ini menginstruksikan mapper untuk mengambil sebuah kamus JSON bersarang, melakukan pemetaan operasi, dan menetapkan objek hasil (atau objek) untuk properti dengan nama yang diberikan. Ini adalah proses diulang untuk setiap operasi pemetaan, memungkinkan grafik objek sewenang-wenang kedalaman untuk dibangun.

Untuk memahami bagaimana ini bekerja, mari kita lihat sebuah contoh. Kami akan berjalan melalui penerapan model data daftar tugas untuk menggambarkan prinsip-prinsip relationship modeling. Kode contoh daftar tugas terkandung dalam kode RKRelationshipMappingExample dalam aplikasi RKCatalog. Dalam RKRelationshipMappingExample, ada tiga model data yang berhubungan dengan satu sama lain: User, Project, dan Task. Pengguna adalah orang-orang yang bekerja dalam sistem. Proyek berisi serangkaian diskrit langkah-langkah yang bekerja ke arah tujuan konkret yang dapat diselesaikan. Tugas mewakili setiap langkah konkret dalam sebuah proyek. Hubungan antara mereka adalah:

  • User memiliki banyak Project
  • Setiap Project dimiliki Single User
  • Setiap Task dimiliki satu Project
  • Setiap T asdapat ditugaskan untuk satu User

Model data dapat ditemukan dalam direktori Core/Models dari contoh aplikasi.

Aplikasi kita sangat sederhana dari sudut pandang antarmuka pengguna. Kami memiliki tampilan satu tabel yang menunjukkan semua proyek dalam sistem dan nama pengguna yang menciptakan proyek. Mengklik pada proyek mendorong tampilan tabel sekunder ke pemandangan yang menunjukkan semua tugas yang terkandung dalam proyek. Daripada membuat beberapa permintaan koleksi sumber individu untuk membangun view, kami akan meminta seluruh objek grafik dari jalan sumber path '/task_list'. JSON yang dikembalikan oleh path sumber daya seperti:

Koleksi JSON ini berorientasi di sekitar sejumlah Project model, dengan struktur bersarang hubungan. Mari kita lihat pelaksanaan Project class kami:

Di sini kita lihat invocation baru untuk elementToRelationshipMappings. Jika Anda sekilas kembali pada struktur JSON, Anda dapat melihat bahwa Deklarasi adalah memerintahkan mapper objek untuk mengambil data yang terdapat dalam 'user' dan 'task' sub dictionary, peta mereka menjadi objek, dan menetapkan User dan serangkaian Task objek untuk Project. Bila semua ini telah selesai, mapper objek akan mengembalikan hasil dan grafik objek lengkap akan dikirim ke Anda objek loader delegasi untuk pengolahan.

Contoh kode - RKRelationshipMappingExample lihat di RKCatalog

Persistence dengan Core Data

Catatan - diasumsikan untuk keperluan tutorial ini bahwa pembaca telah terbiasa dengan Core Data.

Mungkin senjata paling ampuh dalam gudang RestKit's adalah integrasi dengan Apple's Core Data teknologi. Core Data menyediakan queryable persiste objek framework, yang tersedia di OS X dan iOS. Membangun di atas dasar pemetaan objek, RestKit memungkinkan pengembang untuk membuat persistence mirror dari data yang terdapat dalam sistem backend remote dengan sedikit kode. Ada banyak potongan-potongan yang bergerak yang terlibat dalam menyediakan high level abstraksi, jadi mari kita bertemu pemain kunci sebelum menyelam ke rincian:

  • RKManagedObjectStore - objek store membungkus inisialisasi dan konfigurasi kelas Core Data internal termasuk NSManagedObjectModel, NSPersistentStoreCoordinator, dan NSManagedObjectContext. objek store ini juga bertanggung jawab untuk mengelola objek konteks untuk setiap thread dan mengelola perubahan antara thread. Secara umum, objek store berusaha untuk menghapus sebanyak boilerplate kode Core Data sebanyak mungkin dari aplikasi utama.
  • RKManagedObject - superclass semua objek RestKit persistent. RKManagedObject mewarisi dari NSManagedObject dan extend API dengan beberapa metode yang berguna. Ini adalah class RKObjectMappable dan dikonfigurasi untuk pemetaan dengan cara yang sama sebagai sementara contoh RKObject.
  • RKManagedObjectLoader - ketika Core Data mendukung telah dikaitkan ke aplikasi Anda, ini keturunan
    RKObjectLoader menangani pengolahan objek load request. Ia tahu bagaimana untuk secara unik mengidentifikasi objek Core Data yang didukung dan menyembunyikan kompleksitas melintas NSManagedObject's di thread. Juga bertanggung jawab untuk menghapus objek dari local store ketika DELETE proses berhasil.
  • RKManagedObjectCache - protokol cache obyek mendefinisikan metode tunggal untuk pemetaan path sumber daya koleksi mengambil permintaan untuk menarik salinan objek yang 'hidup' di path yang diberikan sumber daya. Kita akan membahas hal ini secara rinci di bawah ini.
  • RKManagedObjectSeeder - seeder objek menyediakan sebuah interface untuk membuat database SQLite yang memuat salinan lokal dari objek remote. Ini dapat digunakan untuk bootstrap lokal database besar sehingga tidak ada proses sinkronisasi panjang diperlukan ketika app pertama download dari App Store. Seeding dibahas secara rinci di bawah ini juga.

Perlu dicatat bahwa tidak ada yang khusus tentang pemanfaatan RestKit's Core Data. Framework menggunakan standar API dan srreamlin task umum. Anda dapat mengintegrasikan RestKit ke aplikasi Core Data yang didukung sudah ada tanpa banyak kesulitan. Setelah terintegrasi, Anda dapat menggunakan semua yang familiar Core Data API's — Anda tidak harus tetap berpegang pada apa yang memperlihatkan RestKit melalui RKManagedObject.

Memulai dengan Core Data

Memungkinkan pemetaan objek persistent adalah proses relatif lurus ke depan. Ini berbeda dari pemetaan objek sementara dalam hanya beberapa cara:

  1. libRKCoreData.a harus dihubungkan ke target Anda
  2. Apple CoreData.framework harus dihubungkan dengan target Anda
  3. Sumber daya Model Data yang harus ditambahkan ke target Anda dan dikonfigurasi dalam Xcode
  4. Core Data RestKit header harus diimpor dengan #import<RestKit oredata/coredata.h="">
  5. Instace RKManagedObjectStore harus dikonfigurasi dan ditetapkan ke manajer objek
  6. Persistent model mewarisi dari RKManagedObject daripada RKObject
  7. Properti Primary Key harus didefinisikan pada masing-masing model yang terus-menerus dengan menerapkan metode primaryKeyProperty
  8. Implementasi untuk properti pada dikelola objek yang dihasilkan melalui @dynamic daripada @synthesize

Setelah perubahan konfigurasi ini telah selesai, RestKit akan memuat & peta payload menjadi Core Data didukung class.

Ada beberapa gotchas Umum dan hal-hal yang perlu diingat ketika bekerja dengan Core Data:

  1. Anda dapat menggunakan campuran gigih dan sementara model dalam aplikasi — bahkan dalam JSON payload sama. RestKit akan menentukan jika objek target didukung oleh Core Data di runtime dan akan
    mengembalikann unmanaged managed objek yang sesuai.
  2. RestKit mengharapkan bahwa setiap instance objek dapat secara unik diidentifikasi melalui satu primary key yang hadir dalam payload. Hal ini memungkinkan mapper untuk membedakan antara baru, diperbarui dan dihapus objek.
  3. Saat mengkonfigurasi sumber Data Model Anda, perawatan harus diambil untuk memastikan bahwa tujuan class diatur ke class model yang diinginkan Anda. Ini default ke NSManagedObject dan harus diperbaharui dengan tepat. Kegagalan untuk melakukan hal ini akan mengakibatkan exception dari dalam mapper ketika RestKit metode dipanggil pada contoh NSManagedObject.
  4. Penggunaan threading core data memerlukan beberapa perawatan khusus. Anda tidak dapat dengan aman melewati instance objek dikelola melintasi batas-batas thread. Mereka harus serial untuk NSManagedObjectID dan menyerahkan antara thread dan kemudian refetched dari konteks dikelola objek. RKObjectLoader melakukan JSON parsing dan pemetaan objek background thread dan menangani thread jumping & objek mengambil untuk Anda. Tapi Anda harus berhati-hati jika Anda memperkenalkan threading (termasuk penggunaan performSelector:withDelay:) di kode aplikasi Anda.
  5. Apple merekomendasikan memanfaatkan satu contoh konteks dikelola objek per thread. Ketika Anda mengambil konteks yang dikelola objek dari RKManagedObjectStore, sebuah instance baru dibuat dan disimpan ke thread local storage jika thread bukan dipanggil di main thread. Anda tidak perlu khawatir tentang mengelola siklus hidup konteks dikelola objek atau menggabungkan perubahan-perubahan — objek store mengamati konteks thread-lokal ini dan menangani menggabungkan perubahan-perubahan kembali ke dalam konteks objek utama.
  6. RestKit membuat beberapa asumsi tentang bagaimana Anda menggunakan Core Data yang mungkin tidak sesuai untuk aplikasi Anda. Ini termasuk kebijakan penggabungan yang digunakan pada konteks objek, pilihan yang disediakan selama inisialisasi persistent store Koordinator, dll. Jika Anda membutuhkan lebih banyak fleksibilitas daripada disediakan out of the box, menjangkau tim dan kami akan membantu melonggarkan asumsi ini.
  7. RestKit menganggap bahwa Anda menggunakan entitas dengan nama yang sama sebagai class model Anda dalam data model.
  8. Tidak ada saat ini bantuan tingkat framework untuk bekerja dengan menyimpan migrasi.

Untuk bantuan memulai dengan Core Data, silakan merujuk ke proyek-proyek yang RKTwitter dan RKTwitterCoreData dalam Examples/ direktori distribusi RestKit. Proyek-proyek ini menyediakan identik implementasi sederhana pemodelan Timeline Twitter kecuali bahwa satu terus-menerus didukung oleh Core Data.

Bekerja dengan Core Data

Sekarang bahwa kita memiliki landasan yang dalam persyaratan dasar untuk menambahkan Core Data untuk proyek RestKit, mari kita lihat beberapa kode untuk membantu kami membuat sesuatu terjadi. Semua kode di bagian ini terdapat dalam proyek Examples/RKCoreDataExamples untuk referensi. Harap pop terbuka proyek dan Ikuti sepanjang seperti kita bekerja melalui contoh-contoh.

Pertama, kita perlu untuk benar-benar mendapatkan RestKit dan Core Data diinisialisasi. Buka RKCDAppDelegate.m dan perhatikan potongan kode berikut:

Apa yang kita lakukan di sini inisialisasi instance manajer objek dan contoh managed object store. Dalam internal RKManagedObject, NSManagedObjectModel dan NSPersistentStoreCoordinator telah diciptakan untuk Anda. persistent store file dibuat atau dibuka kembali untuk Anda dalam aplikasi 's direktori dokumen dan dikonfigurasi untuk menggunakan SQLite sebagai dukungan teknologi. Dari sini Anda memiliki Core Data environemnt siap untuk dipakai.

Sekarang mari kita lihat model agak anemia di Examples/RKCatalog/Examples/RKCoreDataExample/RKCoreDataExample.m:

Di sini kita lihat metode akrab elementToPropertyMappings dari RKObjectMappable. Hanya hal baru di sini adalah penerapan metode menunjukkan primary key. Hal ini memungkinkan mapper objek untuk mengetahui bahwa ketika bekerja dengan contoh artikel, hal itu harus berkonsultasi articleID properti untuk memperoleh nilai primary key untuk instance. Hal ini memungkinkan RestKit untuk memperbarui properti untuk objek ini tidak resource path dimuat dari mana.

Sekarang mari kita membahas beberapa API's melalui RKManagedObject. Memuat semua objek jenis tertentu sepele:

Di sini kita mengambil semua objek untuk class tertentu dari Core Data. Ini membungkus inisialisasi, konfigurasi dan eksekusi permintaan fetch penargetan entitas untuk class kami. Kita juga dapat mengkonfigurasi request fecth sendiri atau memanfaatkan sejumlah metode helper untuk dengan cepat melakukan tugas umum:

Semua metode ini didefinisikan pada RKManagedObject dan menyediakan jalan pintas untuk fitur yang disediakan langsung oleh Core Data. Anda pasti dapat mengkonfigurasi request fetch Anda sendiri sepenuhnya:

Metode pembantu Core Data ini digunakan untuk menampilkan view sederhana tabel di RKCoreDataExample di RKCatalog.

Contoh kode - RKCoreDataExample lihat di RKCatalog

Manajemen hubungan Automagic

Salah satu manfaat paling bagus menggunakan Core Data dengan RestKit adalah bahwa Anda berakhir dengan grafik objek terhidrasi dengan baik bahwa Mari kita Anda melewati hubungan objek alami. Hubungan populasi ditangani melalui penggunaan metode elementToRelationshipMappings kami memperkenalkan di bagian sebelumnya pada pemodelan hubungan. Ingat bahwa elementToRelationshipMappings memerintahkan
mapper untuk mencari benda-benda terkait bersarang sebagai sebuah sub dictionary dalam JSON payload. Tapi ini dapat menimbulkan masalah untuk aplikasi Core Data didukung — jika Anda tidak mengembalikan semua hubungan yang Anda memiliki model dalam muatan Anda, grafik dapat menjadi basi dan keluar dari sinkronisasi dengan server. Dan bukan untuk menyebutkan bahwa mengembalikan semua hubungan sering salah dari perspektif desain atau kinerja API. Jadi apa yang kita lakukan?

RestKit memecahkan masalah ini dengan memperkenalkan baru mapper konfigurasi direktif yang spesifik ke Core Data Objek: relationshipToPrimaryKeyPropertyMappings. Hubungan dengan pemetaan primary key definisi memerintahkan mapper untuk menyambung hubungan Core Data dengan menggunakan nilai yang disimpan dalam properti lain lookup objek target. Ini mudah dimengerti oleh mengembalkan ke daftar tugas data model kami menjelajahi sebelumnya. Ingat bahwa JSON untuk tugas individu yang tampak seperti ini:

Perhatikan unsur assigned_user_id dalam payload — ini adalah nilai primary key untuk objek User yang Task telah ditugaskan. Mari kita lihat kode:

Perhatikan definisi relationshipToPrimaryKeyPropertyMappings-kami telah diberitahu mapper bahwa properti assignedUserID mengandung nilai primary key untuk hubungan assignedUser. Ketika menjadi mapper melihat ini, akan mencerminkan pada hubungan untuk menentukan jenis (dalam hal ini, pengguna) dan menetapkan object.user = User.findByPrimaryKeyValue(object.assignedUserID). Objek target harus ada dalam penyimpanan data lokal atau hubungan akan diatur ke nil.

Contoh kode - RKRelationshipMappingExample lihat di RKCatalog

Pergi Offline: Menggunakan Cache obyek

Dengan penggunaan utama kasus untuk RestKit's integrasi Core Data adalah untuk menyediakan offline akses ke konten yang remote. Bahkan itu dari kebutuhan ini yang RestKit lahir — ketika pengembangan dimulai pada GateGuru (baik, penting app untuk iPhone memegang maskapai wisatawan) kebutuhan primer adalah kemampuan untuk mengakses informasi di 30.000 kaki. Apa yang kita inginkan sebenarnya adalah antarmuka pemrograman umum yang akan bekerja tanpa memandang status online atau offline — jika kita memiliki konektivitas jaringan, ping remote server dan berikan hasil, jika tidak hit cache dan memberikan hasil lokal yang tersedia . Karena kami merancang layanan web kami dengan RESTfully, kita bisa dengan mudah membangun URL yang akan mengakses data tertentu Bandara, terminal, dll. Kami menyadari bahwa kita bisa mencapai API nirvana kami dengan memanfaatkan path resource kami memuat remote objek untuk sebagai key ke persistent store. Ini adalah persis apa RKManagedObjectCache protokol yang memungkinkan Anda untuk melakukan:

Untuk menggunakan cache obyek, Anda perlu menyediakan pelaksanaan RKManagedObjectCache dan menetapkannya ke toko dikelola objek. Pelaksanaan metode perlu memilah path resource dan membangun satu atau lebih mengambil request yang dapat digunakan untuk mengambil objek yang 'hidup' pada path resource tersebut. Misalnya, dalam aplikasi seperti GateGuru yang memiliki koleksi objek Bandara, pelaksanaan Anda mungkin terlihat seperti ini:

Array fetch permintaan dikembalikan untuk mendukung kasus dimana Anda endpoint remote mengembalikan objek dari lebih dari satu jenis — permintaan fetch Data inti hanya dapat menargetkan satu entitas. Setelah Anda telah diberikan sebuah implementasi dan menutupi semua path resource Anda, Anda dapat mengambil objek cache lokal untuk path resource dari objek store:

Obyek cache digunakan secara ekstensif dalam lapisan integrasi Three20 kita akan membahas secara lebih rinci di bawah ini. Singkatnya, jika Anda menggunakan Three20 dalam aplikasi Anda RestKit bersama dengan objek aware sadar implementasi TTModel yang dapat digunakan untuk mengisi tabel dengan data dari objek loader atau cache.

Penanganan Remote objek penghapusan

Selain menyediakan dasar untuk mendukung secara offline, cache obyek menyediakan fitur penting: intelligent penanganan penghapusan objek sisi server. Jika Anda telah memberikan sebuah implementasi dari cache obyek dalam aplikasi Anda, RestKit akan memangkas objek yang saat ini ada di local store tetapi telah menghilang dari muatan payload untuk path resource cache. Jika aplikasi memiliki banyak resource path yang dapat memuat objek yang sama, sangat penting bahwa Anda menangani masing-masing path dan kembali mengambil permintaan meliputi semua objek.

Jika Anda tidak menggunakan cache obyek, Anda harus secara manual menangani objek objek sisi server penghapusan oleh beberapa cara lain.

Database Seeding

Dalam aplikasi Core Data yang didukung, itu bisa sangat diinginkan untuk mengirimkan aplikasi Anda ke App Store dengan konten sudah tersedia di local store. RestKit memasukan object seeding yang sederhana implementasi untuk tujuan ini melalui class RKObjectSeeder. RKObjectSeeder menyediakan sebuah interface untuk membuka satu atau lebih file JSON disimpan dalam bungkusan lokal, proses mereka dengan menjadi mapper, dan kemudian Keluaran petunjuk untuk bagaimana untuk mendapatkan seed database untuk digunakan dalam aplikasi Anda. Proses seeding biasanya terlihat seperti ini:

  1. Menghasilkan berkas dump untuk setiap jenis objek persistent Anda dari sistem backend Anda dalam JSON format.
  2. Duplikat target aplikasi Anda yang sudah ada dan nama target baru "Generate Seed Database".
  3. Melihat pengaturan membangun target Anda dan menemukan GCC - Preprocessing bagian.
  4. Dalam bagian bernama "Preprocessor Macros", menambahkan baru preprocessor makro: RESTKIT_GENERATE_SEED_DB. Nilai ini akan ditentukan ketika kita membangun dan menjalankan seeder target.
  5. Tambahkan berkas dump JSON Anda ke target "Generate Seed Database" dan memastikan mereka akan disalin ke dalam bundel aplikasi.
  6. Memperbarui delegasi aplikasi Anda untuk memeriksa RESTKIT_GENERATE_SEED_DB dan instantiate sebuah instance dari RKObjectSeeder.
  7. Menginisialisasi instance dari RKObjectSeeder dengan contoh Anda sepenuhnya dikonfigurasi dari RKObjectManager
  8. Memanggil metode yang sesuai pada RKObjectSeeder instnace untuk masing-masing berkas dump JSON.
  9. Ketika selesai, memanggil metode finalizeSeedingAndExit pada instance RKObjectSeeder.

Seeder dirancang untuk dijalankan dalam Simulator pada Mac Anda. Ketika Anda memanggil finalizeSeedingAndExit, Perpustakaan akan log rincian ke konsol tentang mana Anda dapat memperoleh database SQLite seed. Setelah Anda mendapatkan salinan database seed, Anda tambahkan ke proyek Anda sebagai resource untuk menyalin ke dalam bundel app. Setelah Anda menambahkan seed database aplikasi Anda, Anda hanya mengubah Anda inisialisasi RKManagedObjectStore untuk menunjukkan bahwa Anda memiliki database seed untuk memulai dengan daripada batu tulis kosong.

Mari kita lihat beberapa contoh kode, diambil dari contoh RKTwitterCoreData, yang menyoroti bagaimana bekerja dengan seeder:

Lapisan integrasi

Hal ini secara singkat diperhatikan bahwa RestKit bersama dengan beberapa lapisan integrasi untuk membantu pengembang yang bekerja dengan beberapa teknologi komplementer. Seperti tulisan ini, ada dua poin integrasi seperti yang tersedia:

  1. RKRailsRouter - implementasi Router yang aware pada Ruby pada Rails idiom
  2. RKRequestTTModel - implementasi protokol TTModel untuk Three20 yang memungkinkan RestKit objek loader untuk drive Three20 tabel

Ruby on Rails dukungan

RKRailsRouter mewarisi dari RKDynamicRouter diperkenalkan di tutorial pertama. Rails router mengubah perilaku routing default dalam beberapa cara:

  1. Memungkinkan untuk pendaftaran nama model sisi server untuk atribut bersarang sebelum mengirim permintaan
  2. Mencegah parameter data yang dikodekan ke dalam body request untuk DELETE request

Atribut bersarang dipahami hanya dengan contoh. Bayangkan bahwa kita memiliki model sisi server yang disebut 'Article', dengan dua atribut 'title' dan 'body'. Kita akan mengkonfigurasi Rails router seperti:

Ketika objek serial untuk permintaan POST, RestKit akan sarang atribut ke hash seperti:

Ini sesuai format yang Rail controller setiap atribut akan dikirimkan pada. Perubahan payload DELETE mudah dipahami hanya mengharapkan params menjadi kosong selama DELETE request dan Rails router ada.

Three20 dukungan

Di Two Toaster, sebagian besar aplikasi iOS kami dibangun di atas dua framework: RestKit dan Three20. Kami telah menemukan bahwa Three20 sangat menyederhanakan dan arus sejumlah pola umum dalam aplikasi iOS kami (seperti dukungan untuk pengiriman URL berbasis) dan menyediakan sebuah perpustakaan yang kaya komponen UI dan helper yang membuat kita lebih bahagia, lebih produktif programmer. Dan RestKit jelas membuat bekerja dengan data jauh lebih menyenangkan. Jadi itu harus datang sebagai kejutan kecil integrasi bahwa ada poin tersedia antara dua framework.

Integrasi antara RestKit dan Three20 mengambil form implementasi protokol TTModel. TTModel mendefinisikan sebuah interface untuk model data abstrak untuk menginformasikan komponen antarmuka pengguna Three20 status mereka dan interface mereka dengan data. TTModel adalah dasar untuk semua Three20 tabel Lihat controller serta sejumlah komponen lain. RestKit bersama dengan sasaran opsional libRestKitThree20 yang menyediakan sebuah antarmuka untuk memulai Three20 tabel view dari sebuah objek RestKit loader melalui class RKRequestTTModel. RKRequestTTModel memungkinkan kita untuk menangani semua pemodelan, parsing dan pemetaan objek dengan RestKit dan kemudian plug model data kami langsung ke Three20 untuk presentasi. RKRequestTTModel juga menyediakan dukungan offline yang transparan dan berkala data menyegarkan diri di antarmuka pengguna kami. Ketika Anda telah menggunakan Core Data kembali model data Anda dan menggunakan RKRequestTTModel dalam controller Anda, RestKit secara otomatis akan menarik setiap objek dari cache yang hidup di path resource yang Anda sedang muat apabila Anda sedang offline. RKRequestTTModel juga dapat dikonfigurasi untuk memukul jaringan hanya setelah jangka waktu tertentu dengan mengkonfigurasi properti refreshRate.

Selain RKRequestTTModel, child class RKRequestFilterableTTModel juga disediakan. RKRequestFilterableTTModel menyediakan dukungan untuk memilah dan pencarian koleksi objek yang dimuat dan dapat berguna untuk menyediakan sisi klien penyaringan operasi.

Menghubungkan titik-titik

Dukungan Three20 terletak di bagian atas piramida besar teknologi dan bergantung pada hampir setiap bagian dari framework yang telah kita bahas sejauh ini. Jumlah kode yang diperlukan untuk melihat manfaat penuh dari framework pada tingkat ini menakutkan untuk menyertakan dalam tubuh teks ini. Fitur lengkap RestKit aplikasi yang memanfaatkan Core Data, Ruby on Rails, dan Three20 tersedia di direktori Examples/RKDiscussionBoardExample Silakan mengambil dekat melihat contoh papan diskusi dan bergabung dengan milis RestKit. Komunitas ini sangat aktif dan lebih dari senang untuk membantu pengguna baru.

Kesimpulan

Kami berharap bahwa Anda telah menemukan belajar tentang RestKit menyenangkan dan bermanfaat. Saat ini kami telah memeriksa sebagian besar framework dan Anda harus siap untuk menggunakan RestKit dalam aplikasi iOS RESTful Anda berikutnya. Framework ini jatuh tempo cepat dan iterasi cepat, jadi pastikan untuk bergabung dengan mailing list atau ikuti @RestKit di Twitter untuk menjaga dengan perkembangan terbaru. Happy coding!

Belajar lebih banyak

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.