{"id":11005,"date":"2014-09-30T15:08:04","date_gmt":"2014-09-30T13:08:04","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=11005"},"modified":"2014-09-30T15:08:04","modified_gmt":"2014-09-30T13:08:04","slug":"selene-come-programmare-task-e-implementare-il-background-fetch-nelle-applicazioni-ios","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/selene-come-programmare-task-e-implementare-il-background-fetch-nelle-applicazioni-ios\/","title":{"rendered":"Selene: come programmare task e implementare il background fetch nelle applicazioni iOS"},"content":{"rendered":"<p>Oggi parliamo di una funzionalit\u00e0 iOS interessante, che rientra tra le attivit\u00e0 che possono essere eseguite mentre l&#8217;app \u00e8 &#8220;chiusa&#8221;: <strong>il fetching di nuovi dati in background<\/strong>. Per chi non lo sapesse, si tratta di un modo intelligente di richiamare l&#8217;app affinch\u00e8 carichi\u00a0dati mentre l&#8217;utente sta utilizzando un&#8217;altra\u00a0applicazione e alla successiva apertura della stessa non occorrer\u00e0 che l&#8217;utente prema l&#8217;eventuale\u00a0tasto refresh per ottenere nuovi dati, perch\u00e9 questi sono gi\u00e0 stati scaricati. Interessante, vero?<\/p>\n<p>Il timing di fetching \u00e8 per\u00f2 gestito solo in parte dallo sviluppatore, ed \u00e8 l&#8217;OS che gestisce gran parte del lavoro. Se pensate che tutto questo sia complicato da gestire niente paura, una libreria utile che sto qui a segnalarvi ci viene in soccorso semplificando tutte\u00a0le procedure per la programmazione di task: <strong>Selene<\/strong>.<!--more--><\/p>\n<p>Il progetto \u00e8 disponibile tramite <strong>Cocoapods<\/strong> (<em>pod &#8216;Selene&#8217;<\/em>) o tramite github a questo indirizzo:\u00a0<a href=\"https:\/\/github.com\/linkedin\/Selene\" target=\"_blank\">https:\/\/github.com\/linkedin\/Selene<\/a> ed \u00e8 gestito da <strong>Linkedin<\/strong>, che ha realizzato per propri scopi il tutto per poi decidere di rilasciarlo liberamente agli iOS Developers.<\/p>\n<p>Per utilizzarlo (come spiegato nel file Readme) \u00e8 necessario inserire tra le modalit\u00e0 di background il fetch.<\/p>\n<p>Ogni task viene gestito come una classe <em>NSObject<\/em> che implementa il protocollo\u00a0<em>SLNTaskProtocol<\/em>. I metodi obbligatori per implementare il protocollo sono i seguenti:<\/p>\n<pre class=\"lang:objc decode:true \">+ (NSString *)identifier {\r\n  return NSStringFromClass(self);\r\n}\r\n\r\n+ (NSOperation *)operationWithCompletion:(SLNTaskCompletion_t)completion {\r\n  NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{\r\n    \/\/ Eseguire il task vero e proprio\r\n    completion(UIBackgroundFetchResultNoData);\r\n  }];\r\n  return operation;\r\n}\r\n\/\/ Tempo di risposta previsto\r\n+ (CGFloat)averageResponseTime {\r\n  return 5.0;\r\n}\r\n\/\/ Priorit\u00e0 del Task\r\n+ (SLNTaskPriority)priority {\r\n  return SLNTaskPriorityLow;\r\n}\r\n<\/pre>\n<p>Dopo aver implementato la propria classe si dovr\u00e0 eseguire altri due passaggi; il primo \u00e8 di aggiungere la classe alla lista di Task schedulati.<\/p>\n<pre class=\"lang:objc decode:true\">NSArray *tasks = @[[SomeTask class]];\r\n\/\/ Esegui il task ogni 5 minuti\r\n[SLNScheduler setMinimumBackgroundFetchInterval:60 * 5];\r\n\/\/ Aggiungi il Task a quelli schedulati\r\n[SLNScheduler scheduleTasks:tasks];\r\n<\/pre>\n<p>Ed infine affidare la gestione da AppDelegate a <strong><em>Selene<\/em><\/strong>:<\/p>\n<pre class=\"lang:objc decode:true \">- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {\r\n  [SLNScheduler startWithCompletion:completionHandler];\r\n}<\/pre>\n<p>Grazie a questo piccolo progetto potrete facilmente implementare il Background fetch nelle vostre app, ricordando sempre di evitare di abusare di questa funzione per evitare spiacevoli sorprese con la batteria dei vostri utenti.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggi parliamo di una funzionalit\u00e0 iOS interessante, che rientra tra le attivit\u00e0 che possono essere eseguite mentre&#8230;<\/p>\n","protected":false},"author":557,"featured_media":10423,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[30,481,105],"tags":[1389,1392,1390,1391],"class_list":["post-11005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materiale-open-source","category-risorse-utili","category-tips-tricks","tag-ios-background-fetch","tag-librerie-ios-developers","tag-programmare-task-ios","tag-selene-ios"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/557"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=11005"}],"version-history":[{"count":7,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11005\/revisions"}],"predecessor-version":[{"id":11016,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11005\/revisions\/11016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/10423"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=11005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=11005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=11005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}