Menyederhanakan Penggunaan RESTful API dan Persistensi Data di iOS dengan Mantle dan Realm
Diterbitkan: 2022-03-11Setiap pengembang iOS akrab dengan Data Inti, grafik objek dan kerangka kerja persistensi dari Apple. Selain menyimpan data secara lokal, framework ini dilengkapi dengan sejumlah fitur lanjutan, seperti pelacakan perubahan objek dan undo. Fitur-fitur ini, meskipun berguna dalam banyak kasus, tidak datang secara gratis. Ini membutuhkan banyak kode boilerplate, dan kerangka kerja secara keseluruhan memiliki kurva belajar yang curam.
Pada tahun 2014, Realm, database seluler, dirilis dan menggemparkan dunia pengembangan. Jika yang kita butuhkan hanyalah menyimpan data secara lokal, Realm adalah alternatif yang baik. Lagi pula, tidak semua kasus penggunaan memerlukan fitur-fitur canggih dari Data Inti. Realm sangat mudah digunakan dan berbeda dengan Core Data, hanya membutuhkan sedikit kode boilerplate. Ini juga thread-safe dan dikatakan lebih cepat daripada framework persistensi dari Apple.
Di sebagian besar aplikasi seluler modern, data yang bertahan memecahkan setengah masalah. Kita sering perlu mengambil data dari layanan jarak jauh, biasanya melalui RESTful API. Di sinilah Mantle berperan. Ini adalah kerangka kerja model sumber terbuka untuk Cocoa dan Cocoa Touch. Mantle secara signifikan menyederhanakan penulisan model data untuk berinteraksi dengan API yang menggunakan JSON sebagai format pertukaran datanya.
Dalam artikel ini, kami akan membangun aplikasi iOS yang mengambil daftar artikel beserta tautannya dari New York Times Article Search API v2. Daftar akan diambil menggunakan permintaan HTTP GET standar, dengan model permintaan dan respons yang dibuat menggunakan Mantle. Kita akan melihat betapa mudahnya Mantle menangani transformasi nilai (mis. dari NSDate ke string). Setelah data diambil, kami akan menyimpannya secara lokal menggunakan Realm. Semua ini dengan kode boilerplate minimal.
RESTful API - Memulai
Mari kita mulai dengan membuat proyek Xcode “Master-Detail Application” baru untuk iOS bernama “RealmMantleTutorial”. Kami akan menambahkan kerangka kerja ke dalamnya menggunakan CocoaPods. Podfile harus menyerupai berikut ini:
pod 'Mantle' pod 'Realm' pod 'AFNetworking'
Setelah pod diinstal, kita dapat membuka ruang kerja MantleRealmTutorial yang baru dibuat. Seperti yang Anda perhatikan, kerangka kerja AFNetworking yang terkenal juga telah diinstal. Kami akan menggunakannya untuk melakukan permintaan ke API.
Seperti yang disebutkan dalam pendahuluan, New York Times menyediakan API pencarian artikel yang sangat baik. Untuk menggunakannya, seseorang perlu mendaftar untuk mendapatkan kunci akses ke API. Ini dapat dilakukan di http://developer.nytimes.com. Dengan kunci API di tangan, kami siap untuk memulai pengkodean.
Sebelum kita mempelajari pembuatan model data Mantle, kita perlu mengaktifkan dan menjalankan lapisan jaringan kita. Mari buat grup baru di Xcode dan beri nama Jaringan. Dalam grup ini kita akan membuat dua kelas. Mari kita panggil yang pertama SessionManager dan pastikan itu berasal dari AFHTTPSessionManager yang merupakan kelas manajer sesi dari AFNetworking , kerangka kerja jaringan yang menyenangkan. Kelas SessionManager kami akan menjadi objek tunggal yang akan kami gunakan untuk melakukan permintaan get ke API. Setelah kelas dibuat, silakan salin kode di bawah ini ke file antarmuka dan implementasi masing-masing.
#import "AFHTTPSessionManager.h" @interface SessionManager : AFHTTPSessionManager + (id)sharedManager; @end
#import "SessionManager.h" static NSString *const kBaseURL = @"http://api.nytimes.com"; @implementation SessionManager - (id)init { self = [super initWithBaseURL:[NSURL URLWithString:kBaseURL]]; if(!self) return nil; self.responseSerializer = [AFJSONResponseSerializer serializer]; self.requestSerializer = [AFJSONRequestSerializer serializer]; return self; } + (id)sharedManager { static SessionManager *_sessionManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sessionManager = [[self alloc] init]; }); return _sessionManager; } @end
Manajer sesi diinisialisasi dengan URL dasar yang ditentukan dalam variabel kBaseURL statis. Itu juga akan menggunakan serializer permintaan dan respons JSON.
Sekarang kelas kedua yang akan kita buat di grup Jaringan akan disebut APIManager . Itu akan diturunkan dari kelas SessionManager kami yang baru dibuat. Setelah model data yang diperlukan dibuat, kami akan menambahkan metode ke ApiManager yang akan digunakan untuk meminta daftar artikel dari API.
Ikhtisar API Pencarian Artikel New York Times
Dokumentasi resmi untuk API luar biasa ini tersedia di http://developer.nytimes.com/…/article_search_api_v2. Apa yang akan kita lakukan adalah menggunakan titik akhir berikut:
http://api.nytimes.com/svc/search/v2/articlesearch
… untuk mengambil artikel yang ditemukan menggunakan istilah kueri penelusuran pilihan kami yang dibatasi oleh rentang tanggal. Misalnya, yang dapat kami lakukan adalah meminta API untuk mengembalikan daftar semua artikel yang muncul di New York Times yang berkaitan dengan bola basket dalam tujuh hari pertama Juli 2015. Menurut dokumentasi API, untuk melakukan itu kita perlu mengatur parameter berikut dalam permintaan get ke titik akhir itu:
Parameter | Nilai |
Q | "bola basket" |
tanggal_mulai | “20150701” |
tanggal_akhir | “20150707” |
Respon dari API cukup kompleks. Di bawah ini adalah respons untuk permintaan dengan parameter di atas terbatas hanya pada satu artikel (satu item dalam larik dokumen) dengan banyak bidang dihilangkan untuk kejelasan.
{ "response": { "docs": [ { "web_url": "http://www.nytimes.com/2015/07/04/sports/basketball/robin-lopez-and-knicks-are-close-to-a-deal.html", "lead_paragraph": "Lopez, a 7-foot center, joined Arron Afflalo, a 6-foot-5 guard, as the Knicks' key acquisitions in free agency. He is expected to solidify the Knicks' interior defense.", "abstract": null, "print_page": "1", "source": "The New York Times", "pub_date": "2015-07-04T00:00:00Z", "document_type": "article", "news_desk": "Sports", "section_name": "Sports", "subsection_name": "Pro Basketball", "type_of_material": "News", "_id": "5596e7ac38f0d84c0655cb28", "word_count": "879" } ] }, "status": "OK", "copyright": "Copyright (c) 2013 The New York Times Company. All Rights Reserved." }
Apa yang pada dasarnya kita dapatkan sebagai tanggapan adalah tiga bidang. Yang pertama disebut response berisi larik docs , yang selanjutnya berisi item yang mewakili artikel. Dua bidang lainnya adalah status dan hak cipta . Sekarang setelah kita mengetahui cara kerja API, saatnya membuat model data menggunakan Mantle.
Pengantar Mantel
Seperti disebutkan sebelumnya, Mantle adalah kerangka kerja sumber terbuka yang secara signifikan menyederhanakan penulisan model data. Mari kita mulai dengan membuat model permintaan daftar artikel. Mari kita panggil kelas ini ArticleListRequestModel dan pastikan itu berasal dari MTLModel , yang merupakan kelas yang harus diturunkan dari semua model Mantle. Selain itu mari kita membuatnya sesuai dengan protokol MTLJSONSerializing . Model permintaan kami harus memiliki tiga properti dari jenis yang sesuai: kueri, articleFromDate , dan articleToDate . Hanya untuk memastikan proyek kami terorganisir dengan baik, saya menyarankan agar kelas ini ditempatkan di grup Model .
Berikut tampilan file antarmuka ArticleListRequestModel :
#import "MTLModel.h" #import "Mantle.h" @interface ArticleListRequestModel : MTLModel <MTLJSONSerializing> @property (nonatomic, copy) NSString *query; @property (nonatomic, copy) NSDate *articlesFromDate; @property (nonatomic, copy) NSDate *articlesToDate; @end
Sekarang jika kita mencari dokumen untuk titik akhir pencarian artikel kita atau melihat tabel dengan parameter permintaan di atas, kita akan melihat bahwa nama variabel dalam permintaan API berbeda dari yang ada dalam model permintaan kita. Mantle menangani ini secara efisien menggunakan metode:
+ (NSDictionary *)JSONKeyPathsByPropertyKey.
Inilah cara metode ini harus diterapkan dalam penerapan model permintaan kami:
#import "ArticleListRequestModel.h" @implementation ArticleListRequestModel #pragma mark - Mantle JSONKeyPathsByPropertyKey + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @"query": @"q", @"articlesFromDate": @"begin_date", @"articlesToDate": @"end_date" }; } @end
Implementasi metode ini menentukan bagaimana properti model dipetakan ke dalam representasi JSON-nya. Setelah metode JSONKeyPathsByPropertyKey diimplementasikan, kita bisa mendapatkan representasi kamus JSON dari model dengan metode kelas +[MTLJSONAdapter JSONArrayForModels:]
.
Satu hal yang masih tersisa, seperti yang kita ketahui dari daftar parameter, adalah bahwa kedua parameter tanggal harus dalam format “YYYYMMDD”. Di sinilah Mantle menjadi sangat berguna. Kita dapat menambahkan transformasi nilai khusus untuk properti apa pun dengan menerapkan metode opsional +<propertyName>JSONTransformer
. Dengan menerapkannya, kami memberi tahu Mantle bagaimana nilai bidang JSON tertentu harus diubah selama deserialisasi JSON. Kami juga dapat mengimplementasikan trafo reversibel yang akan digunakan saat membuat JSON dari model. Karena kita perlu mengubah objek NSDate menjadi string, kita juga akan menggunakan kelas NSDataFormatter . Berikut adalah implementasi lengkap dari kelas ArticleListRequestModel :
#import "ArticleListRequestModel.h" @implementation ArticleListRequestModel + (NSDateFormatter *)dateFormatter { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyyMMdd"; return dateFormatter; } #pragma mark - Mantle JSONKeyPathsByPropertyKey + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @"query": @"q", @"articlesFromDate": @"begin_date", @"articlesToDate": @"end_date" }; } #pragma mark - JSON Transformers + (NSValueTransformer *)articlesToDateJSONTransformer { return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) { return [self.dateFormatter dateFromString:dateString]; } reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) { return [self.dateFormatter stringFromDate:date]; }]; } + (NSValueTransformer *)articlesFromDateJSONTransformer { return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) { return [self.dateFormatter dateFromString:dateString]; } reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) { return [self.dateFormatter stringFromDate:date]; }]; } @end
Fitur hebat lainnya dari Mantle adalah bahwa semua model ini sesuai dengan protokol NSCoding , serta mengimplementasikan metode isEqual dan hash .
Seperti yang telah kita lihat, JSON yang dihasilkan dari panggilan API berisi larik objek yang mewakili artikel. Jika kita ingin memodelkan respon ini menggunakan Mantle, kita harus membuat dua model data yang terpisah. Satu akan memodelkan objek yang mewakili artikel ( elemen larik dokumen ), dan yang lainnya akan memodelkan seluruh respons JSON kecuali untuk elemen larik dokumen. Sekarang, kita tidak perlu memetakan setiap properti dari JSON yang masuk ke dalam model data kita. Misalkan kita hanya tertarik pada dua bidang objek artikel, dan itu adalah lead_paragraph dan web_url . Kelas ArticleModel agak mudah untuk diimplementasikan, seperti yang dapat kita lihat di bawah.
#import "MTLModel.h" #import <Mantle/Mantle.h> @interface ArticleModel : MTLModel <MTLJSONSerializing> @property (nonatomic, copy) NSString *leadParagraph; @property (nonatomic, copy) NSString *url; @end
#import "ArticleModel.h" @implementation ArticleModel #pragma mark - Mantle JSONKeyPathsByPropertyKey + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @"leadParagraph": @"lead_paragraph", @"url": @"web_url" }; } @end
Sekarang model artikel telah ditentukan, kita dapat menyelesaikan definisi model respons dengan membuat model untuk daftar artikel. Beginilah tampilan model respons ArticleList kelas.

#import "MTLModel.h" #import <Mantle/Mantle.h> #import "ArticleModel.h" @interface ArticleListResponseModel : MTLModel <MTLJSONSerializing> @property (nonatomic, copy) NSArray *articles; @property (nonatomic, copy) NSString *status; @end
#import "ArticleListResponseModel.h" @class ArticleModel; @implementation ArticleListResponseModel #pragma mark - Mantle JSONKeyPathsByPropertyKey + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @"articles" : @"response.docs", @"status" : @"status" }; } #pragma mark - JSON Transformer + (NSValueTransformer *)articlesJSONTransformer { return [MTLJSONAdapter arrayTransformerWithModelClass:ArticleModel.class]; } @end
Kelas ini hanya memiliki dua properti: status dan article . Jika kita membandingkannya dengan respons dari titik akhir, kita akan melihat bahwa hak cipta atribut JSON ketiga tidak akan dipetakan ke dalam model respons. Jika kita melihat pada metode articleJSONTransformer , kita akan melihat bahwa metode ini mengembalikan sebuah trafo nilai untuk larik yang berisi objek dari kelas ArticleModel .
Perlu juga dicatat bahwa dalam metode JSONKeyPathsByPropertyKey , artikel properti model sesuai dengan dokumen larik yang bersarang di dalam respons atribut JSON .
Sekarang kita harus memiliki tiga kelas model yang diimplementasikan: ArticleListRequestModel, ArticleModel, dan ArticleListResponseModel.
Permintaan API Pertama
Sekarang kita telah mengimplementasikan semua model data, sekarang saatnya untuk kembali ke kelas APIManager untuk mengimplementasikan metode yang akan kita gunakan untuk melakukan permintaan GET ke API. Metode:
- (NSURLSessionDataTask *) getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure
mengambil model permintaan ArticleListRequestModel sebagai parameter dan mengembalikan ArticleListResponseModel jika berhasil atau NSError sebaliknya. Implementasi metode ini menggunakan AFNetworking untuk melakukan permintaan GET ke API. Harap dicatat bahwa untuk membuat permintaan API yang berhasil, kami perlu memberikan kunci yang dapat diperoleh seperti yang disebutkan sebelumnya, dengan mendaftar di http://developer.nytimes.com.
#import "SessionManager.h" #import "ArticleListRequestModel.h" #import "ArticleListResponseModel.h" @interface APIManager : SessionManager - (NSURLSessionDataTask *)getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure; @end
#import "APIManager.h" #import "Mantle.h" static NSString *const kArticlesListPath = @"/svc/search/v2/articlesearch.json"; static NSString *const kApiKey = @"replace this with your own key"; @implementation APIManager - (NSURLSessionDataTask *)getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure{ NSDictionary *parameters = [MTLJSONAdapter JSONDictionaryFromModel:requestModel error:nil]; NSMutableDictionary *parametersWithKey = [[NSMutableDictionary alloc] initWithDictionary:parameters]; [parametersWithKey setObject:kApiKey forKey:@"api-key"]; return [self GET:kArticlesListPath parameters:parametersWithKey success:^(NSURLSessionDataTask *task, id responseObject) { NSDictionary *responseDictionary = (NSDictionary *)responseObject; NSError *error; ArticleListResponseModel *list = [MTLJSONAdapter modelOfClass:ArticleListResponseModel.class fromJSONDictionary:responseDictionary error:&error]; success(list); } failure:^(NSURLSessionDataTask *task, NSError *error) { failure(error); }]; }
Ada dua hal yang sangat penting terjadi dalam penerapan metode ini. Pertama mari kita lihat baris ini:
NSDictionary *parameters = [MTLJSONAdapter JSONDictionaryFromModel:requestModel error:nil];
Apa yang terjadi di sini adalah bahwa dengan menggunakan metode yang disediakan oleh kelas MTLJSONAdapter kita mendapatkan representasi NSDictionary dari model data kita. Representasi itu mencerminkan JSON yang akan dikirim ke API. Di sinilah letak keindahan Mantle. Setelah menerapkan metode JSONKeyPathsByPropertyKey dan +<propertyName>JSONTransformer
di kelas ArticleListRequestModel, kita bisa mendapatkan representasi JSON yang benar dari model data kita dalam waktu singkat hanya dengan satu baris kode.
Mantle juga memungkinkan kita untuk melakukan transformasi ke arah lain juga. Dan itulah yang terjadi dengan data yang diterima dari API. NSDictionary yang kami terima dipetakan ke dalam objek kelas ArticleListResponseModel menggunakan metode kelas berikut:
ArticleListResponseModel *list = [MTLJSONAdapter modelOfClass:ArticleListResponseModel.class fromJSONDictionary:responseDictionary error:&error];
Data Bertahan dengan Realm
Sekarang kita dapat mengambil data dari API jarak jauh, sekarang saatnya untuk mempertahankannya. Seperti yang disebutkan dalam pendahuluan, kami akan melakukannya menggunakan Realm. Realm adalah database seluler dan pengganti Core Data dan SQLite. Seperti yang akan kita lihat di bawah, ini sangat mudah digunakan.
Untuk menyimpan sepotong data di Realm, pertama-tama kita perlu mengenkapsulasi objek yang diturunkan dari kelas RLMObject. Yang perlu kita lakukan sekarang adalah membuat kelas model yang akan menyimpan data untuk satu artikel. Inilah betapa mudahnya membuat kelas seperti itu.
#import "RLMObject.h" @interface ArticleRealm : RLMObject @property NSString *leadParagraph; @property NSString *url; @end
Dan ini bisa jadi pada dasarnya, implementasi kelas ini bisa tetap kosong. Harap dicatat bahwa properti di kelas model tidak memiliki atribut seperti nonatomic, strong, atau copy. Realm mengurus itu dan kita tidak perlu khawatir tentang mereka.
Karena artikel yang bisa kita dapatkan dimodelkan dengan model Mante Article , akan lebih mudah untuk menginisialisasi objek ArticleRealm dengan objek dari kelas Article . Untuk melakukan itu kita akan menambahkan metode initWithMantleModel ke model Realm kita. Berikut implementasi lengkap dari kelas ArticleRealm .
#import "RLMObject.h" #import "ArticleModel.h" @interface ArticleRealm : RLMObject @property NSString *leadParagraph; @property NSString *url; - (id)initWithMantleModel:(ArticleModel *)articleModel; @end
#import "ArticleRealm.h" @implementation ArticleRealm - (id)initWithMantleModel:(ArticleModel *)articleModel{ self = [super init]; if(!self) return nil; self.leadParagraph = articleModel.leadParagraph; self.url = articleModel.url; return self; } @end
Kami berinteraksi dengan database menggunakan objek kelas RLMRealm . Kita dapat dengan mudah mendapatkan objek RLMRealm dengan menjalankan metode “[RLMRealm defaultRealm]”. Penting untuk diingat bahwa objek semacam itu hanya valid di dalam utas tempat ia dibuat dan tidak dapat dibagikan di seluruh utas. Menulis data ke Realm cukup mudah. Satu penulisan, atau serangkaian, perlu dilakukan dalam transaksi tulis. Berikut ini contoh penulisan ke database:
RLMRealm *realm = [RLMRealm defaultRealm]; ArticleRealm *articleRealm = [ArticleRealm new]; articleRealm.leadParagraph = @"abc"; articleRealm.url = @"sampleUrl"; [realm beginWriteTransaction]; [realm addObject:articleRealm]; [realm commitWriteTransaction];
Apa yang terjadi di sini adalah sebagai berikut. Pertama kita membuat objek RLMRealm untuk berinteraksi dengan database. Kemudian objek model ArticleRealm dibuat (harap diingat bahwa itu berasal dari kelas RLMRealm ). Akhirnya untuk menyimpannya, transaksi tulis dimulai, objek ditambahkan ke database, dan setelah disimpan, transaksi tulis dilakukan. Seperti yang bisa kita lihat, transaksi tulis memblokir utas tempat mereka dipanggil. Sementara Realm dikatakan sangat cepat, jika kita menambahkan beberapa objek ke database dalam satu transaksi di utas utama, itu dapat menyebabkan UI menjadi tidak responsif hingga transaksi selesai. Solusi alami untuk itu adalah melakukan transaksi tulis seperti itu di utas latar belakang.
Permintaan API dan Respons Tetap di Realm
Ini semua informasi yang kami butuhkan untuk mempertahankan artikel menggunakan Realm. Mari kita coba melakukan permintaan API menggunakan metode
- (NSURLSessionDataTask *) getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure
dan model permintaan dan tanggapan Mantle untuk mendapatkan artikel New York Times yang berkaitan (seperti dalam contoh sebelumnya) dengan bola basket dan diterbitkan dalam tujuh hari pertama bulan Juni 2015. Setelah daftar artikel tersebut tersedia, kami akan mempertahankannya di Realm. Di bawah ini adalah kode yang melakukan itu. Itu ditempatkan di metode viewDidLoad dari pengontrol tampilan tabel di aplikasi kami.
ArticleListRequestModel *requestModel = [ArticleListRequestModel new]; // (1) requestModel.query = @"Basketball"; requestModel.articlesToDate = [[ArticleListRequestModel dateFormatter] dateFromString:@"20150706"]; requestModel.articlesFromDate = [[ArticleListRequestModel dateFormatter] dateFromString:@"20150701"]; [[APIManager sharedManager] getArticlesWithRequestModel:requestModel // (2) success:^(ArticleListResponseModel *responseModel){ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // (3) @autoreleasepool { RLMRealm *realm = [RLMRealm defaultRealm]; [realm beginWriteTransaction]; [realm deleteAllObjects]; [realm commitWriteTransaction]; [realm beginWriteTransaction]; for(ArticleModel *article in responseModel.articles){ ArticleRealm *articleRealm = [[ArticleRealm alloc] initWithMantleModel:article]; // (4) [realm addObject:articleRealm]; } [realm commitWriteTransaction]; dispatch_async(dispatch_get_main_queue(), ^{ // (5) RLMRealm *realmMainThread = [RLMRealm defaultRealm]; // (6) RLMResults *articles = [ArticleRealm allObjectsInRealm:realmMainThread]; self.articles = articles; // (7) [self.tableView reloadData]; }); } }); } failure:^(NSError *error) { self.articles = [ArticleRealm allObjects]; [self.tableView reloadData]; }];
Pertama, panggilan API dibuat (2) dengan model permintaan (1), yang mengembalikan model respons yang berisi daftar artikel. Untuk mempertahankan artikel tersebut menggunakan Realm kita perlu membuat objek model Realm, yang berlangsung di for loop (4). Penting juga untuk diperhatikan bahwa karena beberapa objek bertahan dalam satu transaksi tulis, transaksi tulis tersebut dilakukan pada utas latar belakang (3). Sekarang, setelah semua artikel disimpan di Realm, kami menetapkannya ke properti kelas self.articles (7). Karena mereka akan diakses nanti di utas utama dalam metode sumber data TableView, aman untuk mengambilnya dari database Realm di utas utama juga (5). Sekali lagi, untuk mengakses database dari utas baru, objek RLMRealm baru perlu dibuat (6) di utas itu.
Jika mendapatkan artikel baru dari API gagal karena alasan apa pun, artikel yang sudah ada akan diambil dari penyimpanan lokal di blok kegagalan.
Membungkus
Dalam tutorial ini kita mempelajari cara mengonfigurasi Mantle, kerangka model untuk Cocoa dan Cocoa Touch, untuk berinteraksi dengan API jarak jauh. Kami juga mempelajari cara mempertahankan data yang diambil secara lokal dalam bentuk objek model Mantle menggunakan basis data seluler Realm.
Jika Anda ingin mencoba aplikasi ini, Anda dapat mengambil kode sumber dari repositori GitHub-nya. Anda perlu membuat dan menyediakan kunci API Anda sendiri sebelum menjalankan aplikasi.