Gostaria de carregar uma imagem de uma URL no meu aplicativo, então tentei primeiro com o Objective-C e funcionou, no entanto, com Swift, tenho um erro de compilação:
'imageWithData' está indisponível: use a construção do objeto 'UIImage (dados :)'
Minha função:
@IBOutlet var imageView : UIImageView
override func viewDidLoad() {
super.viewDidLoad()
var url:NSURL = NSURL.URLWithString("http://myURL/ios8.png")
var data:NSData = NSData.dataWithContentsOfURL(url, options: nil, error: nil)
imageView.image = UIImage.imageWithData(data)// Error here
}
No Objetivo-C:
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:(@"http://myURL/ios8.png")];
NSData *data = [NSData dataWithContentsOfURL:url];
_imageView.image = [UIImage imageWithData: data];
_labelURL.text = @"http://www.quentinroussat.fr/assets/img/iOS%20icon's%20Style/ios8.png";
}
Alguém pode me explicar por que imageWithData:
isso não funciona com o Swift e como posso resolver o problema.
imageURL.image = UIImage(data: myDataVar)
Respostas:
Xcode 8 ou posterior • Swift 3 ou posterior
Sincronicamente:
Assíncrona:
Crie um método com um manipulador de conclusão para obter os dados da imagem do seu URL
Crie um método para baixar a imagem (inicie a tarefa)
Uso:
Extensão :
Uso:
fonte
UITableView
onde uma célula mostra uma imagem e a imagem é atualizada quando a célula desenfileirada é retornada. Se o processo 1 demorar mais do que o processo 2, o processo 2 mostrará sua imagem e, posteriormente, será atualizado pelo processo 1, mesmo que essa imagem não seja mais válida para o usuário.(Atualização do Swift 4) Para responder diretamente à pergunta original, aqui está o equivalente rápido do snippet Objective-C publicado.
AVISO LEGAL:
É importante observar que o
Data(contentsOf:)
método baixará o conteúdo da URL de forma síncrona no mesmo encadeamento em que o código está sendo executado, portanto , não o invoque no encadeamento principal do seu aplicativo.Uma maneira fácil de executar o mesmo código de forma assíncrona, sem bloquear a interface do usuário, é usando o GCD:
Dito isto, em aplicativos da vida real, se você deseja ter a melhor experiência do usuário e evitar vários downloads da mesma imagem, convém que eles não sejam apenas baixados, mas armazenados em cache. Já existem algumas bibliotecas que fazem isso de maneira transparente e todas elas são realmente fáceis de usar. Eu, pessoalmente, recomendo o Kingfisher :
E é isso
fonte
image.url
por qualquer url corda, codificado ou não :)URLSession.dataTask
porque muitas outras respostas aqui já mostram como fazê-lo. É melhor manter as diferentes opções abertas.Se você deseja apenas carregar a imagem (de forma assíncrona!) - basta adicionar esta pequena extensão ao seu código rápido:
E use-o desta maneira:
fonte
cancel
botão para de baixar. Você tem alguma idéia de como posso fazer isso usando esse método? Preciso adicionar a funcionalidade de cancelamento.Swift 2.2 || Xcode 7.3
Ele fornece vários recursos, como:
e muito fácil de implementar para o seu aplicativo
Etapa.1 Instalar pods
Alamofire 3.3.x
AlamofireImage 2.4.x
Etapa.2 importar e usar
é isso aí!! vai cuidar de tudo
Muito obrigado à equipe da Alamofire , por facilitar a vida dos iDevelopers;)
fonte
Xcode 8 • Swift 3
A resposta de Leo Dabus é incrível! Eu só queria fornecer uma solução de função multifuncional:
fonte
Agrupei o código das melhores respostas para a pergunta em uma única classe reutilizável, estendendo o UIImageView, para que você possa usar diretamente o carregamento assíncrono do UIImageViews no storyboard (ou criá-los a partir do código).
Aqui está a minha turma:
e aqui está como usá-lo:
fonte
Swift 4 :
Isso mostra o carregador enquanto carrega a imagem. Você pode usar o NSCache, que armazena imagens temporariamente
Uso:-
fonte
fonte
fatal error: unexpectedly found nil while unwrapping an Optional value
FYI: Para swift-2.0 Xcode7.0 beta2
fonte
swift 3 com tratamento de erros
With Extension
Uso da extensão
Com suporte a cache
fonte
Swift 4: Um carregador simples para imagens pequenas (ex: miniaturas) que usa o NSCache e sempre roda no thread principal:
Uso:
fonte
class
.Você vai querer fazer:
No Swift, eles substituíram a maioria dos métodos de fábrica do Objective C por construtores regulares.
Vejo:
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26
fonte
+(instancetype)[MyThing thingWithOtherThing:]
, também o chamaria comoMyThing(otherThing: ...)
no Swift.Swift 2 com identificador de erro e cabeçalho de solicitação personalizada
Basta adicionar uma extensão ao UIImageView:
E então, use o novo
imageFromUrl(urlString: String)
para baixar a imagemUso:
fonte
Swift 4
Este método fará o download de uma imagem de um site de forma assíncrona e a armazenará em cache:
Em uso:
fonte
Swift 2.0:
1)
OU
2) Adicione este método ao VC ou Extension.
Uso:
fonte
URL do Github - https://github.com/onevcat/Kingfisher
fonte
Aqui está o código de trabalho para carregamento / download de imagem do URL. NSCache automaticamente e exibir imagem de espaço reservado antes de baixar e carregar imagem real (código Swift 4).
Use assim:
fonte
Um método para obter uma imagem segura e que funcione com o Swift 2.0 e o X-Code 7.1:
Você chamaria esse método da seguinte maneira:
Se você estiver atualizando a visualização com a imagem, precisará usá-la após o "if success {":
O motivo dessa última parte ser necessária se você estiver usando a imagem na interface do usuário é porque as chamadas de rede demoram. Se você tentar atualizar a interface do usuário usando a imagem sem chamar dispatch_async como acima, o computador procurará a imagem enquanto a imagem ainda está sendo buscada, descobrirá que ainda não há imagem e seguirá em frente como se não houvesse imagem. encontrado. Colocar seu código dentro de um fechamento de conclusão dispatch_async diz ao computador: "Vá, pegue esta imagem e, quando terminar, conclua este código". Dessa forma, você terá a imagem quando o código for chamado e tudo funcionará bem.
fonte
Se você está procurando uma implementação muito, muito simples. (Isso funcionou para mim no Swift 2)
Eu implementei dentro de uma tableview com uma célula personalizada que tem apenas uma imagem
fonte
Eu recomendo usar a biblioteca Kingfisher para baixar imagens de forma assíncrona. A melhor parte do uso do Kingfisher é que ele armazena em cache todas as imagens baixadas por padrão, com o URL da imagem como um ID. Da próxima vez que você solicitar o download de uma imagem com esse URl específico, ele será carregado do cache.
Uso:
fonte
Você pode usar o pod
SDWebImage
para conseguir o mesmo. É fácil de usar. Você pode obter a documentação aqui SDWebImageAqui está o código de exemplo
fonte
veloz 5
para usar
fonte
As únicas coisas que faltam são: a!
fonte
Resposta Swift 2.x que baixa imagem em arquivo (em oposição à resposta de Leo Dabus, que armazena a imagem na memória). Com base na resposta de Leo Dabus e na resposta de Rob de Obtenha os dados de NSURLSession DownloadTaskWithRequest do manipulador de conclusão :
fonte
Swift 4.1 Eu criei uma função apenas passe o URL da imagem, a chave de cache após a imagem ser gerada, configure-a para o bloco de conclusão.
fonte
Eu criei uma função de classe simples na minha
Utils.swift
classe para chamar esse método que você pode simplesmente acessarclassname.methodname
e suas imagens são salvas no NSCache usando aImageCaching.swift
classeFeliz codificação. Felicidades:)
fonte
Swift 4.2 e AlamofireImage
Se o uso de uma biblioteca não for um problema, você poderá fazê-lo com a ajuda do
AlamofireImage
. minhas amostras são do GithubExemplo de imagens de espaço reservado:
possui muitas funções úteis e extensão para trabalhar com imagens. do cache ao dimensionamento e redimensionamento ou até à aplicação de filtros na imagem. se as imagens forem importantes no seu aplicativo, sugiro usar essa estrutura e economizar seu tempo.
fonte
Usando o Ascyimageview, você pode carregar facilmente o imageurl no imageview.
deixe image1Url: URL = URL (string: "(imageurl)" como String)! imageview.imageURL = image1Url
fonte
Carregamento de imagem do servidor: -
Uso: -
fonte
Para obter melhor desempenho
UITableView
ouUICollectionView
usar a biblioteca de pouco peso Carregamento Preguiçoso Inteligente Você pode usar esta abordagem de carregamento lento se desejar carregar imagens de url Asynchronous'Carregamento lento' inteligente
UICollectionView
ouUITableView
usandoNSOperation
eNSOperationQueue
no iOS Portanto, neste projeto, podemos fazer o download de várias imagens em qualquer Visualização (UICollectionView
ouUITableView
) otimizando o desempenho de um aplicativo usandoOperation
eOperationQueue
por simultaneidade. A seguir, estão o ponto principal deste projeto Smart Lazy Loading: Criando serviço de download de imagens. Priorize o download com base na visibilidade das células.A classe ImageDownloadService criará uma instância singleton e terá uma instância NSCache para armazenar em cache as imagens que foram baixadas. Nós herdamos a classe Operation para TOperation para alterar a funcionalidade de acordo com nossa necessidade. Penso que as propriedades da subclasse de operação são bastante claras em termos de funcionalidade. Estamos monitorando as mudanças de estado das operações usando o KVO.
fonte