AFNetworking Error Domain= NSPOSIXErrorDomain Code= 12 "A operação não pôde ser concluída. Não é possível alocar memória
-
28-10-2019 - |
Pergunta
Estou enviando muitos arquivos de imagem via AfNetworking para um servidor Rails.No limite e às vezes 3G, recebo este erro: Error Domain= NSPOSIXErrorDomain Code= 12 "A operação não pôde ser concluída. Não é possível alocar memória".
Este é o código que estou usando para enviar os arquivos: https://gist.github.com/cc5482059ae3023bdf50
Existe uma maneira de consertar isso?
Online, algumas pessoas sugerem que uma solução alternativa seria transmitir os arquivos.Não consegui encontrar um tutorial sobre streaming de vários arquivos usando AFNetworking.Como posso fazer isso?
Solução
Qual o tamanho das imagens?E quantos você está tentando enviar?
Não consigo encontrar uma maneira fácil de implementar um NSInputStream
usando AFNetworking
, mas há definitivamente uma coisa que você deve tentar, que é evitar colocar objetos grandes no pool de liberação automática.Quando você está criando grandes instâncias NSData em um loop for, e elas vão para o pool de liberação automática, toda a memória permanece enquanto o loop dura.Esta é uma maneira de otimizá-lo:
for (int i=0; i<[self.sImages count]; i++) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSData *imageData = UIImageJPEGRepresentation([self.sImages objectAtIndex:i], 0.7);
[formData appendPartWithFileData:imageData name:@"pics[]" fileName:@"avatar.jpg" mimeType:@"image/jpeg"];
pool drain];
}
Ou, se você estiver usando LLVM3:
for (int i=0; i<[self.sImages count]; i++) {
@autoreleasepool {
NSData *imageData = UIImageJPEGRepresentation([self.sImages objectAtIndex:i], 0.7);
[formData appendPartWithFileData:imageData name:@"pics[]" fileName:@"avatar.jpg" mimeType:@"image/jpeg"];
}
}
Outras dicas
Sei que já faz um tempo que essa pergunta foi feita, mas preciso dar minha opinião sobre o assunto.
Depois de passar a maior parte da semana tentando descobrir essas coisas, é aqui que estou agora:
- Este problema acontece comigo em um antigo iPhone 4 ligeiramente danificado com iOS 5.1.1
- Não consigo reproduzi-lo em um iPhone 4S não danificado com o mesmo iOS 5.1.1
Pode ser por causa de uma rede defeituosa pelo próprio hardware do telefone ou pode ser sobre a necessidade de limitar a largura de banda (ou apenas um bug em NSURLConnection):
http://aws.amazon.com/articles/0006282245644577
https://forums.dropbox.com/topic.php?id=25351
Erro POSIX 12 (" Não é possível alocar memória ") durante o upload de arquivos de um iPhone
Eu teria mudado para ASIHTTPRequest, mas não é mais mantido, então agora vale a pena implementá-lo. Talvez eu ainda deva tentar AFNetworking, mas estou realmente começando a pensar que este é um problema que já foi corrigido no iOS (ou pode ser um iPhone de má qualidade no meu caso).
Mas não consigo encontrar uma explicação simples para isso.