Sto utilizzando AFNetworking con il modello Singleton suggerito in their example.modifica AFNetworking baseURL
+ (SGStockRoomHTTPClient *)sharedClient
{
static SGStockRoomHTTPClient *_sharedClient = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
NSString *baseUrlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"server_root_url_preference"];
_sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:baseUrlString]];
});
return _sharedClient;
}
- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self setDefaultHeader:@"Accept" value:@"text/html"];
return self;
}
L'inizializzazione viene eseguita con un valore baseURL preso dalle impostazioni predefinite dell'utente.
Il mio problema è che la proprietà baseURL è di sola lettura. Se l'utente accede alle impostazioni e modifica l'impostazione predefinita dell'utente baseURL, come posso modificarlo nel mio client?
Un altro caso simile che ho bisogno di cambiare baseURL è un'API che richiede più chiamate e logica per determinare il giusto URL di base. E l'URL base può ancora cambiare mentre l'app è in esecuzione (ad esempio, l'utente cambia l'ambiente di rete che richiede una modifica dalla connessione locale alla connessione 3G tramite un server proxy esterno).
Vedo perché la proprietà baseURL è di sola lettura: ci sono cose come networkReachabilityStatus che vengono eseguite in background e sono legate a tale impostazione. Detto questo, sembra abbastanza facile avere un metodo setBaseURL che interrompe il monitoraggio, modifica il valore, quindi avvia di nuovo il monitoraggio ...
Suppongo che il mio progetto non sia corretto, dovrei rinunciare al singleton in questo caso e ricreare il client ogni volta che il database di base dovrebbe cambiare?
Per chiarire, la questione è abbastanza specifico per AFNetworking: come si dovrebbe usare AFHTTPClient con le API che non dispongono di un URL fisso di base, ma qualcosa che l'utente (o la logica del programma) dovrebbe specificare? L'esempio con i valori predefiniti dell'utente è buono, il codice sopra riportato funziona ma l'utente deve chiudere e riavviare l'app per attivare le modifiche. – caiman
Buona domanda! Ho un problema simile Dovrei cambiare server su un server secondario quando il server primario non funziona. E il ritorno quando il primario quando questo è attivo e di nuovo in esecuzione. –