Ich benutze Schlüssel-Wert-Codierung, um alle Künstler aus iTunes zu bekommen:
%Vor%Nun, das funktioniert gut. Dies ist sehr effizient. Ich würde das auch gerne mit dem Album machen.
%Vor%Das Problem hier ist, dass es mehrere Alben mit demselben Namen gibt, aber nicht unbedingt vom selben Künstler. Gibt es eine Möglichkeit, ein Lied von jedem Album zu bekommen, damit ich herausfinden kann, um welche Künstler es sich handelt, und auch das Cover davon? Ich weiß, dass es ein NSPredikat gibt, aber das ist sehr langsam.
Der spezifische Code ist nicht wichtig, ich brauche nur den Schlüssel-Wert-Coding-Teil.
Danke!
Dies ist keine vollständige Antwort.
Für Leute wie mich, die ursprünglich nicht wussten, wo dies dokumentiert wurde: Sie müssen auf einem Mac mit iTunes installiert sein und dann den Befehl
ausführen %Vor% was magisch iTunes.h
in Ihrem aktuellen Arbeitsverzeichnis erzeugt. Dann können Sie durch iTunes.h
gehen, um zu sehen, wie die API aussieht. Es scheint nicht offiziell in der Mac Developer Library oder so etwas dokumentiert zu sein.
Jedes iTunesTrack
hat neben der artist
-Eigenschaft eine album
-Eigenschaft, also würde ich denken, dass Sie nur ein Array von eindeutigen Tupeln (album, artist)
zurückgeben wollen.
Also, wie können wir aus einer einzigen KVC-Abfrage eine Reihe von Tupeln erstellen? Wir möchten etwas wie [email protected][email protected]
schreiben und haben so etwas wie NSArray
von NSDictionary
, zum Beispiel @[ @{ @"Help!", @"The Beatles" }, @{ @"No!", @"They Might Be Giants" }, ... ]
BEARBEITEN ughoavgfhw schlug den nächsten Schritt in einem Kommentar vor: Sie könnten eine Kategorie verwenden, um albumAndArtist
wie folgt zu definieren:
Und jetzt können Sie die Zeile schreiben, die wir schreiben wollten:
%Vor% Dies sollte Ihnen NSArray
von NSDictionary
geben, was im Grunde das ist, was Sie wollten. Wohlgemerkt, ich habe diesen Code oder irgendetwas nicht getestet!
@Ilija: Wenn du postest, dass du es losgelassen hast, dann hast du es noch nicht wirklich losgelassen. ;) Lassen Sie mich sehen, ob ich meinen Kommentar klären kann:
%Vor% Die obige Methode album
wird automatisch vom Objective-C-Compiler erzeugt. * Die albumAndArtist
-Methode ist das, was ich in meiner Antwort auf Ihre ursprüngliche Frage vorgeschlagen habe. Wenn Sie nun Clang bitten, diese beiden Methoden auf C ( clang -rewrite-objc test.m -o test.cc
) zu reduzieren, erhalten Sie etwas wie folgt:
oder in menschlicher Hinsicht
%Vor% Probieren Sie es aus: drei sel_registerName
s, ein objc_getClass
, drei objc_msgSend
s, zwei calloc
s und zwei free
s. Das ist ziemlich ineffizient, verglichen mit der vom Compiler generierten Methode album
.
Technisch gesehen sieht die vom Compiler generierte Methode
%Vor%album
wie folgt aus:aber das liegt nur daran, dass es ursprünglich nicht als
nonatomic
deklariert wurde. Für die Bedeutung vonobjc_getProperty
siehe hier ; aber im Grunde ist es schneller als einobjc_msgSend
gewesen wäre.)
Also wird albumAndArtist
viel langsamer sein als album
, wegen all der zusätzlichen Arbeit, die es macht. Aber - fragst du - was ist, wenn wir all diese Arbeit loswerden und self.album
zurückgeben? Nun, der generierte Code ist immer noch haariger als das, was der Compiler für den% code% getter erzeugt hat:
Wenn Ihr Programm album
aufruft, ruft es myTrack.album
einmal auf, um herauszufinden, dass es die objc_msgSend
-Methode aufruft, und ruft dann in album
album
auf. Das sind zwei Anrufe. (Drei, wenn Sie objc_getProperty
zählen.)
Wenn Ihr Programm selector_registerName("album")
aufruft, ruft es myTrack.albumAndArtist_stripped_down
einmal auf, um herauszufinden, dass es die Methode objc_msgSend
aufrufen soll, und dann ruft das albumAndArtist_stripped_down
ein zweites Mal auf das ruft objc_msgSend
auf. Das sind drei Anrufe. (Fünf, wenn Sie objc_getProperty
zählen.)
Es macht also Sinn, dass selector_registerName
ungefähr doppelt so langsam ist (oder 5/3 so langsam) wie albumAndArtist_stripped_down
von selbst.
Und wie bei der ursprünglichen album
, nur durch Zählen der Funktionsaufrufe, würde ich erwarten, dass es etwa fünf mal so langsam ist wie albumAndArtist
... aber natürlich wird es viel album
keine tut. Speicherzuweisung und -bereinigung ist sehr teuer, weil album
selbst ein komplizierter Algorithmus ist.
Ich hoffe, das klärt das Problem für Sie auf. :)
Tags und Links objective-c nspredicate enumeration key-value-coding