{"id":106,"date":"2008-09-26T09:21:01","date_gmt":"2008-09-26T08:21:01","guid":{"rendered":"http:\/\/www.ilinux.it\/content\/?p=106"},"modified":"2011-07-19T00:00:04","modified_gmt":"2011-07-18T23:00:04","slug":"cocoa-e-il-mistero-del-predicato-perduto-parte-seconda-the-fog","status":"publish","type":"post","link":"https:\/\/www.ilinux.it\/content\/cocoa-e-il-mistero-del-predicato-perduto-parte-seconda-the-fog.html","title":{"rendered":"Cocoa e il mistero del predicato perduto (Parte seconda: The Fog)"},"content":{"rendered":"<p><a href=\"http:\/\/www.ilinux.it\/content\/wp-content\/uploads\/2010\/08\/shapeimage_11.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-97\" src=\"http:\/\/www.ilinux.it\/content\/wp-content\/uploads\/2010\/08\/shapeimage_11.png\" alt=\"\" width=\"286\" height=\"160\" srcset=\"https:\/\/www.ilinux.it\/content\/wp-content\/uploads\/2010\/08\/shapeimage_11.png 357w, https:\/\/www.ilinux.it\/content\/wp-content\/uploads\/2010\/08\/shapeimage_11-300x168.png 300w\" sizes=\"(max-width: 286px) 100vw, 286px\" \/><\/a><span style=\"font-size: medium\">Con la precedente puntata ci siamo lasciati svelando il mistero legato al &#8220;fetch predicate&#8221; di un oggetto NSTreeController; non sembra per\u00f2 diradarsi la nebbia di mistero che avvolge il mondo Cocoa.<!--more-->Sembra che proprio l&#8217;astrazione NSTreeController sia quella maggiormente pregna di misteri e trabocchetti.<\/span><\/p>\n<p><span style=\"font-size: medium\">Diciamo da subito che in questo caso non siamo di fronte ad un nuovo &#8220;predicato perduto&#8221;, ma ci sembrava doveroso collocare questo discorso a seguire, in una ideale continuit\u00e0 con il mistero precedente: un &#8220;sequel&#8221;, insomma, come ogni buon film di cassetta, con tanto di aberrazioni rispetto alla storia originale.<\/span><\/p>\n<p><span style=\"font-size: medium\">Arcani e oscuri dunque sono i metodi di NSTreeController ed il modo di utilizzarli: le cose si fanno ancora pi\u00f9 esoteriche quando si metta il tutto in relazione a Core Data, altro &#8220;enigmatico strumento&#8221;.<\/span><\/p>\n<p><span style=\"font-size: medium\">Abbiamo gi\u00e0 detto come Core Data sia stato forgiato a somiglianza di basi dati relazionali senza raggiungerne l&#8217;immagine speculare; tra i limiti di questa somiglianza \u00e8 da considerare l&#8217;assenza di direttive di ordinamento e raggruppamento dei dati quali conosciamo nei RDBMS (mediante espressioni quali ORDER BY, GROUP BY, note a chi &#8220;mastica&#8221; di SQL).<\/span><\/p>\n<p><span style=\"font-size: medium\">La conseguenza pi\u00f9 evidente \u00e8 la comune accettazione che le informazioni rese persistenti un contesto Core Data non sono restituite in modo ordinato, ne per attributo, ne tanto mento per epoca di creazione. Ma \u00e8 questo realmente un limite di Core Data come gli si imputa? O di nuovo siamo davanti ad una non comprensione dei ruoli.<\/span><\/p>\n<p><span style=\"font-size: medium\">E&#8217; forse compito del modello manipolare i dati? Non sar\u00e0 che in un paradigma MVC \u00e8 compito del controller?<\/span><\/p>\n<p><span style=\"font-size: medium\">Core Data rappresenta il livello Modello nel paradigma MVC: l&#8217;ordinamento dei dati \u00e8 un compito di presentazione e dunque pi\u00f9 propriamente compito del livello Controllo.<\/span><\/p>\n<p><span style=\"font-size: medium\">Il vero mistero sarebbe allora l&#8217;assenza di strumenti utili a compiere questi aggiustamenti di presentazione in astrazioni di controllo quali NSArrayController e NSTreeController, dati appunto allo scopo di soddisfare le necessit\u00e0 della stragrande parte degli oggetti di Visualizzazione in Cocoa (omettiamo NSObjectController che non \u00e8 adatto alla gestione di aggregati di dati).<\/span><\/p>\n<p><span style=\"font-size: medium\">Eppure sembra che le soluzioni all&#8217;ordinamento di dati Core Data vengono spesso ricercate in implementazioni personali, artistiche, complesse ma inutili.<\/span><\/p>\n<p><span style=\"font-size: medium\">La soluzione \u00e8 invero a portata di mano ed \u00e8 rappresentata da una istanza di oggetto NSSortDescriptor. <a href=\"http:\/\/databerry.com\/solutions\/portal-software.php\" rel=\"dofollow\">enterprise portal software<\/a> . Questi oggetti sono introdotti nel framework al solo scopo di descrivere criteri di ordinamento di informazioni quali quelle di un oggetto container.<\/span><\/p>\n<p><span style=\"font-size: medium\">Se il Modello offerto da Core Data viene gestito dunque in modo semplice ed ottimizzato da istanze di oggetti controller, possibile che questi non abbiano metodi di ordinamento dei &#8220;managedObjects&#8221; il cui risultato sia esposto nei &#8220;arrangedObjects&#8221;? Non \u00e8 credibile.<\/span><\/p>\n<p><span style=\"font-size: medium\">Tra i compiti degli oggetti di controllo container (NSArrayController e NSTreeController) c&#8217;\u00e8 infatti anche la realizzazione di un ordinamento dei dati: questo avviene per mezzo del metodo -setSortDescriptors.<\/span><\/p>\n<p><span style=\"font-size: medium\">Qualsiasi sia l&#8217;ordine dei dati internamente al contesto di Core Data, il controller sar\u00e0 in grado di imporre un proprio ordine, manipolando l&#8217;insieme dei dati a favore di una visualizzazione utile all&#8217;utente finale.<\/span><\/p>\n<p><span style=\"font-size: medium\">L&#8217;ordinamento non \u00e8 mantenuto nella persistenza ma &#8220;calcolato&#8221; ogni volta dal controller: eventualmente si pu\u00f2 mantenere persistente l&#8217;indicatore con cui l&#8217;utente impone un proprio ordinamento, ma l&#8217;azione vera e propria di ordinamento sar\u00e0 eseguita dal controller.<\/span><\/p>\n<p><span style=\"font-size: medium\">Cos\u00ec un NSSortDescriptor che imponga un ordinamento lessicografico su un attributo del modello risulterebbe indipendente da interventi utente, mentre un NSSortDescriptor che imponga un ordinamento rispetto ad altro attributo concepito come &#8220;peso&#8221; della posizione indicata dall&#8217;utente risulter\u00e0 strumento efficace ad ordinare le informazioni secondo quanto chiesto dall&#8217;utente. <a href=\"http:\/\/www.stokedskateboards.com\/wheels.html\" rel=\"dofollow\">longboard wheels<\/a> . Nessun codice accessorio \u00e8 necessario.<\/span><\/p>\n<p><span style=\"font-size: medium\">Ci sembra con questo di aver concluso con i misteri.<\/span><\/p>\n<p><span style=\"font-size: medium\">In realt\u00e0 si potrebbe concludere con un elogio della autosufficienza del framework Cocoa che dovrebbe essere naturalmente ovvia; Cocoa \u00e8 framework del sistema MacOSX, e non un generico framework per sviluppo software compatibile-con; dunque in se deve avere tutto o quasi il necessario a risolvere le questioni di implementazione dei pi\u00f9 comuni paradigmi di interfaccia utente introdotti nel HIG (Human Interface Guideline) di Apple. E questo riesce a fare, migliorandosi ad ogni revisione.<\/span><\/p>\n<p><span style=\"font-size: medium\"><br \/>\n<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>Con la precedente puntata ci siamo lasciati svelando il mistero legato al &#8220;fetch predicate&#8221; di un oggetto NSTreeController; non sembra per\u00f2 diradarsi la nebbia di mistero che avvolge il mondo Cocoa.<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,4],"tags":[],"_links":{"self":[{"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/posts\/106"}],"collection":[{"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/comments?post=106"}],"version-history":[{"count":8,"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/posts\/106\/revisions"}],"predecessor-version":[{"id":176,"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/posts\/106\/revisions\/176"}],"wp:attachment":[{"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/media?parent=106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/categories?post=106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilinux.it\/content\/wp-json\/wp\/v2\/tags?post=106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}