Objective C keypath, um alle Künstler aus iTunes zu holen

9

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!

    
NSAddict 10.09.2012, 21:18
quelle

2 Antworten

4

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 sources.@distinctUnionOfArrays.playlists.@distinctUnionOfArrays.tracks.albumAndArtist 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:

%Vor%

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!

    
Quuxplusone 19.09.2012, 19:01
quelle
1

@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:

%Vor%

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 album wie folgt aus:

%Vor%      

aber das liegt nur daran, dass es ursprünglich nicht als nonatomic deklariert wurde. Für die Bedeutung von objc_getProperty siehe hier ; aber im Grunde ist es schneller als ein objc_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:

%Vor%

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 langsamer als das, weil es mindestens drei Speicherzuweisungen macht, während 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. :)

    
Quuxplusone 11.10.2012 18:35
quelle