2011-10-14 7 views
9

Questa non è una domanda su un problema pertinente. È una questione sulla quale cerco di approfondire la mia comprensione dell'Objective-C o di una più specifica Cocoa Foundation.Quando dovrei usare NSURL invece di NSString e viceversa?

Quando si tratta di caricare e scaricare file da un server alle mie app, sono costantemente diviso tra l'utilizzo di NSURL o NSString per tutto il percorso relativo. Ovviamente, quando c'è un'API esistente, la uso solo in base alle specifiche. Ma quando immagazzino i miei percorsi o creo classi personalizzate che li riguardano, sono confuso quale dei due sarebbe la scelta migliore.

NSString è utilizzato ovunque e ha metodi di convenienza come stringByAppendingPathComponent: e stringByAppendingPathExtension:. Posso facilmente convertire in NSURL creando una nuova istanza con [NSURL URLWithString:@"string"] e viceversa chiamando [url path] in un'istanza NSURL. Ma la differenza è lì per una ragione, giusto?

La mia confusione aumenta quando guardo i file di intestazione di qualcosa come NSFileManager. Questi due metodi sono abbastanza vicine tra loro:

- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error; 
- (BOOL)copyItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL error:(NSError **)error NS_AVAILABLE(10_6, 4_0); 

Perché dovrei scegliere di utilizzare uno sopra l'altro, soprattutto quando le conversioni tra i due sono così facilmente? E perché Apple ha il problema di creare API quasi identiche per l'utilizzo di entrambi i tipi di dati?

Se qualcuno ha informazioni più dettagliate su quando utilizzare NSURL anziché NSString per le proprie classi che gestiscono i percorsi dei file e gli URL remoti, si prega di condividere! Saluti.

+0

E quando si fa riferimento ai file sul filesystem locale? – Jason

+0

Cosa intendi? 'NSURL' ha un [vasto insieme di metodi che trattano gli URL del file system] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/doc/uid/20000301-SW25). – epologee

+0

Così fa NSString. Sembra che NSURL sia generalmente preferito, ma mi chiedo se questo porta anche a file locali. – Jason

risposta

3

In generale per le operazioni relative percorso si dovrebbe preferire NSURL sopra NSString perché le informazioni di percorso possono essere memorizzate in modo più efficiente in NSURL (secondo il riferimento di classe per NSFileManager). Quindi consiglierei che per le tue API usi anche NSURL.

anche NSURL ha URLByAppendingPathComponent: e URLByAppendingPathExtension: così convenienza è servita pure :-)

+2

+1 Inoltre, le imminenti regole di sandboxing del Mac App Store richiedono autorizzazioni, che (a quanto ho capito) sono memorizzate all'interno di NSURL stesso, rendendo più semplice l'archiviazione dell'accesso al filesystem per un uso successivo. –

8

NSUrl sa come gestire virtualmente qualsiasi re degli URL - non solo Web-indirizzi e si divide in semplici pezzi accessibili:

  • protocollo o schema (http, ftp, telnet, SSH)
  • username e la password (ad esempio, per SSH: ssh: // utente: [email protected])
  • ospitanti nome
  • porta
  • percorso
  • parametri GET

ora si può facilmente chiede l'URL-oggetto per questo pezzi, mentre in una stringa ci potrebbe essere la necessità di una eccessiva se le regole o complicato regex di.

+0

Grazie per aver chiarito, +1. Dovevo scegliere chi dare il marchio e @applaudierend aveva il riferimento lì dentro. – epologee