Eu tenho uma tonelada de códigos repetidos em minha classe que se parecem com o seguinte:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self];
O problema com as solicitações assíncronas é quando você tem várias solicitações saindo e tem um delegado designado para tratá-las todas como uma entidade, muitas ramificações e códigos feios começam a ser formulados:
Que tipo de dados estamos recebendo? Se contiver isso, faça aquilo, senão faça outro. Acho que seria útil ser capaz de marcar essas solicitações assíncronas, como se você fosse capaz de marcar visualizações com IDs.
Eu estava curioso para saber qual estratégia é mais eficiente para gerenciar uma classe que lida com várias solicitações assíncronas.
fonte
[NSMapTable weakToStrongObjectsMapTable]
vez de umCFMutableDictionaryRef
e evitar o aborrecimento. Funcionou bem para mim.Tenho um projeto em que tenho duas NSURLConnections distintas e queria usar o mesmo delegado. O que fiz foi criar duas propriedades em minha classe, uma para cada conexão. Então, no método delegado, eu verifico se qual conexão é
Isso também me permite cancelar uma conexão específica por nome quando necessário.
fonte
A subclasse de NSURLConnection para conter os dados é limpa, menos código do que algumas das outras respostas, é mais flexível e requer menos consideração sobre o gerenciamento de referência.
Use-o como faria com NSURLConnection e acumule os dados em sua propriedade de dados:
É isso aí.
Se quiser ir mais longe, você pode adicionar um bloco para servir como um retorno de chamada com apenas mais algumas linhas de código:
Defina assim:
e invoque-o quando o carregamento terminar desta forma:
Você pode estender o bloco para aceitar parâmetros ou apenas passar o DataURLConnection como um argumento para o método que precisa dele dentro do bloco no-args como mostrado
fonte
ESTA NÃO É UMA NOVA RESPOSTA. POR FAVOR, DEIXE-ME MOSTRAR COMO EU FIZ
Para distinguir NSURLConnection diferentes dentro dos métodos delegados da mesma classe, eu uso NSMutableDictionary, para definir e remover o NSURLConnection, usando seu
(NSString *)description
chave como.O objeto que escolhi
setObject:forKey
é o URL exclusivo que é usado para iniciarNSURLRequest
, osNSURLConnection
usos.Depois de definir NSURLConnection é avaliada em
fonte
Uma abordagem que tomei é não usar o mesmo objeto como delegado para cada conexão. Em vez disso, crio uma nova instância de minha classe de análise para cada conexão que é disparada e defino o delegado para essa instância.
fonte
Experimente minha classe personalizada, MultipleDownload , que trata de tudo isso para você.
fonte
Normalmente crio uma série de dicionários. Cada dicionário tem algumas informações de identificação, um objeto NSMutableData para armazenar a resposta e a própria conexão. Quando um método de delegado de conexão é acionado, procuro no dicionário da conexão e o manejo de acordo.
fonte
Uma opção é simplesmente criar uma subclasse NSURLConnection e adicionar uma -tag ou método semelhante. O design do NSURLConnection é intencionalmente muito básico, então isso é perfeitamente aceitável.
Ou talvez você possa criar uma classe MyURLConnectionController que seja responsável por criar e coletar os dados de uma conexão. Então, ele só teria que informar seu objeto controlador principal quando o carregamento for concluído.
fonte
no iOS5 e acima, você pode apenas usar o método de classe
sendAsynchronousRequest:queue:completionHandler:
Não há necessidade de monitorar as conexões, pois a resposta retorna no manipulador de conclusão.
fonte
Eu gosto de ASIHTTPRequest .
fonte
Conforme apontado por outras respostas, você deve armazenar connectionInfo em algum lugar e procurá-los por conexão.
O tipo de dados mais natural para isso é
NSMutableDictionary
, mas não pode aceitarNSURLConnection
como chaves, pois as conexões não podem ser copiadas.Outra opção para usar
NSURLConnections
como chavesNSMutableDictionary
é usarNSValue valueWithNonretainedObject]
:fonte
Decidi criar uma subclasse NSURLConnection e adicionar uma tag, delegado e um NSMutabaleData. Eu tenho uma classe DataController que lida com todo o gerenciamento de dados, incluindo as solicitações. Eu criei um protocolo DataControllerDelegate, para que visões / objetos individuais possam ouvir o DataController para descobrir quando suas solicitações foram concluídas e, se necessário, quanto foi baixado ou erros. A classe DataController pode usar a subclasse NSURLConnection para iniciar uma nova solicitação e salvar o delegado que deseja ouvir o DataController para saber quando a solicitação foi concluída. Esta é minha solução de trabalho no XCode 4.5.2 e ios 6.
O arquivo DataController.h que declara o protocolo DataControllerDelegate). O DataController também é um singleton:
Os principais métodos no arquivo DataController.m:
E para iniciar um pedido:
[[NSURLConnectionWithDelegate alloc] initWithRequest:request delegate:self startImmediately:YES tag:@"Login" dataDelegate:delegate];
O NSURLConnectionWithDelegate.h: @protocol DataControllerDelegate;
E o NSURLConnectionWithDelegate.m:
fonte
Cada NSURLConnection tem um atributo hash, você pode discriminar todos por este atributo.
Por exemplo, eu preciso manter certas informações antes e depois da conexão, então meu RequestManager tem um NSMutableDictionary para fazer isso.
Um exemplo:
Após solicitação:
fonte