Joka iOS-kehittäjä tuntee Applen Core Data -objektikuvaajan ja pysyvyyskehyksen. Sen lisäksi, että tietoja säilytetään paikallisesti, kehyksessä on joukko lisäominaisuuksia, kuten objektimuutosten seuranta ja kumoaminen. Vaikka nämä ominaisuudet ovat hyödyllisiä monissa tapauksissa, ne eivät tule ilmaiseksi. Se vaatii paljon kattilakoodia, ja kehyksellä kokonaisuutena on jyrkkä oppimiskäyrä.
Vuonna 2014 Valtakunta , mobiilitietokanta, julkaistiin ja otti kehitystyön myrskyn. Jos tarvitsemme vain tietojen säilyttämistä paikallisesti, Realm on hyvä vaihtoehto. Loppujen lopuksi kaikki käyttötapaukset eivät vaadi ydintietojen lisäominaisuuksia. Realm on erittäin helppokäyttöinen ja toisin kuin Core Data, vaatii hyvin vähän kattilakoodia. Se on myös säiettä turvallinen ja sanotaan olevan nopeampi kuin Applen pysyvyyskehys.
Useimmissa nykyaikaisissa mobiilisovelluksissa jatkuva data ratkaisee puolet ongelmasta. Meidän on usein haettava tietoja etäpalvelusta, yleensä RESTful-sovellusliittymän kautta. Täällä Mantle tulee peliin. Se on avoimen lähdekoodin mallikehys kaakaolle ja Cocoa Touchille. Mantle yksinkertaistaa merkittävästi tietomallien kirjoittamista vuorovaikutuksessa käytettyjen sovellusliittymien kanssa JSON tietojenvaihtomuotona.
Tässä artikkelissa rakennamme iOS-sovelluksen, joka noutaa luettelon artikkeleista ja linkit niihin New York Times Article Search API v2: sta. Luettelo haetaan käyttämällä tavallista HTTP GET -pyyntöä, ja pyyntö- ja vastausmallit luodaan Mantlella. Saamme nähdä, kuinka helppoa Mantlen on käsitellä arvonmuutoksia (esim. NSDatesta merkkijonoon). Kun tiedot on haettu, säilytämme ne paikallisesti Realm-sovelluksella. Kaikki tämä minimaalisella kattilakoodilla.
Aloitetaan luomalla uusi 'Master-Detail Application' Xcode-projekti iOS: lle nimeltä RealmMantleTutorial. Lisäämme siihen kehyksiä CocoaPods-sovelluksella. Podfailin tulisi muistuttaa seuraavaa:
pod 'Mantle' pod 'Realm' pod 'AFNetworking'
Kun palot on asennettu, voimme avata juuri luodut MantleRealmOhjekirja työtila. Kuten huomaat, myös kuuluisa AFNetworking-kehys on asennettu. Käytämme sitä pyyntöjen suorittamiseen API: lle.
Kuten johdannossa mainittiin, New York Times tarjoaa erinomaisen artikkelihaun sovellusliittymän. Käyttääksesi sitä, sinun on kirjauduttava sisään, jotta saat käyttöliittymän avaimen. Tämä voidaan tehdä osoitteessa http://developer.nytimes.com . API-avain kädessä olemme valmiita aloittamaan koodauksen.
Ennen kuin syvennämme Mantle-tietomallien luomista, meidän on saatava verkkokerros käyttöön. Luodaan uusi ryhmä Xcodessa ja kutsutaan sitä verkoksi. Tässä ryhmässä luomme kaksi luokkaa. Soitetaan ensimmäinen SessionManager ja varmista, että se on peräisin AFHTTPSessionManager joka on istunnonhallintaluokka AFVerkko , ihana verkostoitumiskehys. Meidän SessionManager luokka on yksittäinen objekti, jota käytämme suorittaaksemme pyyntöjä sovellusliittymään. Kun luokka on luotu, kopioi alla oleva koodi käyttöliittymä- ja toteutustiedostoihin.
#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
Istunnonhallinta alustetaan staattisessa määritetyllä perus-URL-osoitteella kBaseURL muuttuja. Se käyttää myös JSON-pyyntö- ja vastaussarjaa.
Nyt toinen luokka, jonka aiomme luoda Verkko ryhmä kutsutaan APIManager . Se on johdettava uudesta luomastamme SessionManager luokassa. Kun tarvittavat tietomallit on luotu, lisätään menetelmä ApiManager jota käytetään hakemaan luettelo artikkeleita sovellusliittymältä.
Tämän erinomaisen sovellusliittymän viralliset asiakirjat ovat saatavilla osoitteessa http://developer.nytimes.com/…/article_search_api_v2 . Aiomme käyttää seuraavaa päätepistettä:
http://api.nytimes.com/svc/search/v2/articlesearch
… Hakemaan artikkeleita, jotka löytyvät valitsemallamme hakulausekkeella, jota rajoittaa ajanjakso. Voisimme esimerkiksi pyytää API: ta palauttamaan luettelon kaikista New York Times -lehdessä ilmestyvistä artikkeleista, joilla oli mitään tekemistä koripallon kanssa heinäkuun seitsemän ensimmäisen päivän aikana. API: n mukaan dokumentointi , niin meidän on asetettava seuraavat parametrit kyseisen päätelaitteen hakupyynnössä:
Parametri | Arvo |
mitä | 'koripallo' |
aloituspäivä | '20150701' |
päättymispäivä | '20150707' |
API: n vastaus on melko monimutkainen. Alla on vastaus pyyntöön, jonka yllä olevat parametrit on rajoitettu vain yhteen artikkeliin (yksi kohde docs-taulukossa) lukemattomien kenttien vuoksi selkeyden vuoksi.
{ '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.' }
Vastaus on periaatteessa kolme kenttää. Ensimmäinen soitti vastaus sisältää taulukon asiakirjat , joka puolestaan sisältää artikkeleita edustavia kohteita. Kaksi muuta kenttää ovat Tila ja tekijänoikeudet . Nyt kun tiedämme, miten sovellusliittymä toimii, on aika luoda tietomalleja Mantlen avulla.
Kuten aiemmin mainittiin, Mantle on avoimen lähdekoodin kehys, joka yksinkertaistaa merkittävästi tietomallien kirjoittamista. Aloitetaan luomalla artikkeliluettelopyyntömalli. Kutsutaan tätä luokkaa ArticleListRequestModel ja varmista, että se on peräisin MTL-malli , joka on luokka, josta kaikki Mantle-mallit tulisi johtaa. Tehdään sen lisäksi MTLJSONSerialisointi protokolla. Pyyntömallissamme tulisi olla kolme sopivaa tyyppiä: kysely, articlesFromDate ja articlesToDate . Ehdotan, että tämä luokka sijoitetaan vain varmistaaksemme, että projektimme on hyvin järjestetty Mallit ryhmä.
Mantle yksinkertaistaa tietomallien kirjoittamista, vähentää kattilakoodia. TweetNäin ArticleListRequestModel pitäisi näyttää:
#import 'MTLModel.h' #import 'Mantle.h' @interface ArticleListRequestModel : MTLModel @property (nonatomic, copy) NSString *query; @property (nonatomic, copy) NSDate *articlesFromDate; @property (nonatomic, copy) NSDate *articlesToDate; @end
Nyt kun etsimme artikkelin hakupäätteen asiakirjoja tai tarkastelemme yllä olevaa taulukkoa, jossa on pyyntöparametreja, huomaamme, että API-pyynnön muuttujien nimet eroavat pyyntömallimme nimistä. Mantle hoitaa tämän tehokkaasti menetelmällä:
+ (NSDictionary *)JSONKeyPathsByPropertyKey.
Näin tämä menetelmä tulisi ottaa käyttöön pyyntömallimme toteutuksessa:
#import 'ArticleListRequestModel.h' @implementation ArticleListRequestModel #pragma mark - Mantle JSONKeyPathsByPropertyKey + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @'query': @'q', @'articlesFromDate': @'begin_date', @'articlesToDate': @'end_date' }; } @end
Tämän menetelmän toteutus määrittää, miten mallin ominaisuudet kartoitetaan sen JSON-esityksiin. Kun menetelmä JSONKeyPathsByPropertyKey on toteutettu, voimme saada mallin JSON-sanakirjaesityksen luokan menetelmällä +[MTLJSONAdapter JSONArrayForModels:]
Yksi asia, joka on vielä jäljellä, kuten tiedämme parametriluettelosta, on, että molempien päivämääräparametrien on oltava muodossa 'VVVVKKPP'. Tässä Mantle on erittäin kätevä. Voimme lisätä minkä tahansa ominaisuuden mukautetun arvonmuunnoksen toteuttamalla valinnaisen menetelmän +JSONTransformer
Toteuttamalla sen kerromme Mantlelle, kuinka tietyn JSON-kentän arvo tulisi muuttaa JSON-deserialisoinnin aikana. Voimme myös toteuttaa käännettävän muuntajan, jota käytetään JSON-mallin luomisessa. Koska meidän on muutettava NSDate objektista merkkijonoksi, käytämme myös sitä NSDataFormatter luokassa. Tässä on ohjelman täydellinen toteutus ArticleListRequestModel luokka:
#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
Toinen Mantlen suuri ominaisuus on, että kaikki nämä mallit ovat NSC-koodaus sekä toteuttaa on yhtä kuin ja hash menetelmiä.
Kuten olemme jo nähneet, tuloksena oleva JSON API-kutsusta sisältää joukon esineitä edustavia objekteja. Jos haluamme mallintaa tämän vastauksen Mantlella, meidän on luotava kaksi erillistä tietomallia. Yksi voisi mallintaa esineitä edustavia esineitä ( asiakirjat taulukkoelementit), ja toinen mallinnaisi koko JSON-vastauksen paitsi docs-taulukon elementit. Nyt meidän ei tarvitse kartoittaa jokaista omaisuutta tulevasta JSONista tietomalleihimme. Oletetaan, että meitä kiinnostaa vain kaksi artikkeliobjektien kenttää, ja ne olisivatkin johtaa_ kappale ja web_url . Artikkelin malli luokka on melko yksinkertainen toteuttaa, kuten voimme nähdä alla.
#import 'MTLModel.h' #import @interface ArticleModel : MTLModel @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
Nyt kun artikkelimalli on määritelty, voimme lopettaa vastemallin määrityksen luomalla mallin artikkeliluettelolle. Näin luokan artikkelilistan vastemalli näyttää.
#import 'MTLModel.h' #import #import 'ArticleModel.h' @interface ArticleListResponseModel : MTLModel @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
Tällä luokalla on vain kaksi ominaisuutta: Tila ja artikkeleita . Jos verrataan sitä päätepisteen vastaukseen, näemme, että kolmatta JSON-määritteen tekijänoikeutta ei yhdistetä vastemalliin. Jos katsomme artikkelitJSONTransformer Menetelmä, näemme, että se palauttaa arvomuuntajan matriisille, joka sisältää luokan esineitä Artikkelin malli .
On myös syytä huomata, että menetelmässä JSONKeyPathsByPropertyKey , malliominaisuus artikkeleita vastaavat JSON-määritteeseen sisäkkäin olevia matriisidokumentteja vastaus .
Tähän mennessä meillä pitäisi olla toteutettu kolme malliluokkaa: ArticleListRequestModel, ArticleModel ja ArticleListResponseModel.
Nyt kun olemme ottaneet käyttöön kaikki tietomallit, on aika palata luokkaan APIManager toteuttaa menetelmä, jota käytämme GET-pyyntöjen suorittamiseen API: lle. Menetelmä:
- (NSURLSessionDataTask *) getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure
vie ArticleListRequestModel pyydä malli parametrina ja palauttaa arvon ArticleListResponseModel onnistumisen tai muuten NSE-virheen sattuessa. Tämän menetelmän toteuttaminen käyttää AFVerkko suorittaa GET-pyyntö API: lle. Huomaa, että onnistuneen API-pyynnön tekemiseksi meidän on annettava avain, joka voidaan hankkia kuten aiemmin mainittiin, rekisteröitymällä osoitteeseen 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); }]; }
Tämän menetelmän toteuttamisessa tapahtuu kaksi erittäin tärkeää asiaa. Tarkastellaan ensin tätä riviä:
NSDictionary *parameters = [MTLJSONAdapter JSONDictionaryFromModel:requestModel error:nil];
Tässä tapahtuu, että käyttämällä menetelmää tarjoaa MTLJSON-sovitin luokassa saamme a NSDictionary tietomallimme esitys. Tämä esitys peilaa JSON: ää, joka lähetetään API: lle. Tässä on Mantlen kauneus. Toteutettu JSONKeyPathsByPropertyKey ja +JSONTransformer
ArticleListRequestModel-luokan menetelmillä voimme saada tietomallimme oikean JSON-esityksen hetkessä vain yhdellä koodirivillä.
Mantle antaa meille mahdollisuuden suorittaa myös muunnoksia toiseen suuntaan. Ja juuri näin tapahtuu API: lta vastaanotettujen tietojen kanssa. Saamamme NSDictionary on yhdistetty ArticleListResponseModel-luokan objektiin seuraavaa luokamenetelmää käyttäen:
ArticleListResponseModel *list = [MTLJSONAdapter modelOfClass:ArticleListResponseModel.class fromJSONDictionary:responseDictionary error:&error];
Nyt kun voimme hakea tietoja etäsovellusliittymästä, on aika jatkaa niitä. Kuten johdannossa mainittiin, teemme sen Realmilla. Realm on mobiilitietokanta ja korvaa ydintiedot ja SQLiten. Kuten näemme alla, sitä on erittäin helppo käyttää.
Realm, lopullinen mobiilitietokanta, on täydellinen korvike ydintiedoille ja SQLite-sivustoille. TweetTietojen tallentamiseksi Realmiin meidän on ensin kapseloitava objekti, joka on johdettu RLMObject-luokasta. Meidän on nyt luotava malliluokka, joka tallentaa tietoja yksittäisille artikkeleille. Näin on helppo luoda tällainen luokka.
#import 'RLMObject.h' @interface ArticleRealm : RLMObject @property NSString *leadParagraph; @property NSString *url; @end
Ja tämä voi olla pohjimmiltaan, tämän luokan toteutus voi jäädä tyhjäksi. Huomaa, että malliluokan ominaisuuksissa ei ole ominaisuuksia, kuten ei-atomisia, vahvoja tai kopioituja. Valtakunta huolehtii niistä ja meidän ei tarvitse huolehtia niistä.
Koska saamamme artikkelit on mallinnettu Mante-mallilla Artikla se olisi kätevä alustaa ArtikkeliRealm esineitä luokan esineillä Artikla . Voit tehdä sen lisäämällä initWithMantleModel menetelmä Realm-malliin. Tässä on sovelluksen täydellinen toteutus ArtikkeliRealm luokassa.
#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
Olemme vuorovaikutuksessa tietokannan kanssa luokan esineiden avulla RLMRealm . Voimme helposti saada RLMRealm objektin kutsumalla menetelmä '[RLMRealm defaultRealm]'. On tärkeää muistaa, että tällainen objekti on kelvollinen vain säikeessä, johon se luotiin, eikä sitä voi jakaa ketjujen kesken. Tietojen kirjoittaminen Realmiin on melko suoraviivaista. Kirjoitustapahtuman sisällä on tehtävä yksi kirjoitus tai sarja niistä. Tässä on esimerkkikirjoitus tietokantaan:
RLMRealm *realm = [RLMRealm defaultRealm]; ArticleRealm *articleRealm = [ArticleRealm new]; articleRealm.leadParagraph = @'abc'; articleRealm.url = @'sampleUrl'; [realm beginWriteTransaction]; [realm addObject:articleRealm]; [realm commitWriteTransaction];
Tässä tapahtuu seuraavaa. Ensin luomme RLMRealm objekti vuorovaikutuksessa tietokannan kanssa. Sitten ArtikkeliRealm malliobjekti luodaan (muista, että se on johdettu mallista RLMRealm luokka). Lopuksi sen tallentaminen alkaa kirjoitustapahtuma, objekti lisätään tietokantaan, ja kun se on tallennettu, kirjoitusoperaatio suoritetaan. Kuten näemme, kirjoitusoperaatiot estävät ketjun, johon niitä käytetään. Vaikka Realmin sanotaan olevan erittäin nopea, jos lisättäisiin useita objekteja tietokantaan yhden tapahtuman sisällä pääketjussa, se voi johtaa siihen, että käyttöliittymä ei vastaa, kunnes tapahtuma on valmis. Luonnollinen ratkaisu on suorittaa tällainen kirjoitusoperaatio taustalangalle.
Tämä on kaikki tiedot, joita tarvitsemme artikkeleiden säilyttämiseksi Realmissa. Yritetään suorittaa API-pyyntö menetelmällä
- (NSURLSessionDataTask *) getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure
ja Mantle-pyyntö- ja vastausmallit saadaksemme New York Times -artikkelit, joilla oli mitään tekemistä (kuten edellisessä esimerkissä) koripallon kanssa ja jotka julkaistiin kesäkuun 2015 seitsemän ensimmäisen päivän aikana. Kun luettelo tällaisista artikkeleista on saatavilla, jatkaa sitä valtakunnassa. Alla on koodi, joka tekee sen. Se sijoitetaan viewDidLoad menetelmä sovelluksen taulukonäkymän ohjaimessa.
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]; }];
Ensin tehdään API-kutsu (2) pyyntömallilla (1), joka palauttaa vastausmallin, joka sisältää luettelon artikkeleista. Jotta artikkelit pysyisivät voimassa Realm-sovelluksen avulla, meidän on luotava Realm-mallin objekteja, joka tapahtuu for-silmukassa (4). On myös tärkeää huomata, että koska yhdellä kirjoitustapahtumalla säilytetään useita objekteja, kirjoitusoperaatio suoritetaan taustalangalle (3). Kun kaikki artikkelit on tallennettu Realmiin, määritämme ne luokan omaisuuteen itse .artikkelit (7). Koska niitä käytetään myöhemmin TableView-tietolähdemenetelmien pääketjussa, on turvallista hakea ne myös pääketjun Realm-tietokannasta (5). Jälleen kerran, jotta pääsy tietokantaan uudesta säikeestä, kyseiseen säikeeseen on luotava uusi RLMRealm-objekti (6).
Jos uusien artikkeleiden saaminen sovellusliittymältä epäonnistuu jostain syystä, nykyiset artikkelit haetaan vikailohkon paikallisesta tallennustilasta.
Tässä opetusohjelmassa opimme kuinka konfiguroida Mantle, Cocoa and Cocoa Touch -mallikehys vuorovaikutukseen kaukosäätimen kanssa ANTAA POTKUT . Opimme myös, kuinka paikallisesti säilyttää Mantle-malliobjektien muodossa haetut tiedot Realm-mobiilitietokannan avulla.
Jos haluat kokeilla tätä sovellusta, voit hakea lähdekoodin sen GitHub-arkisto . Sinun on luotava ja annettava oma API-avain ennen sovelluksen suorittamista.