sdwebimage / sdwebimagephotosplugin Goto Github PK
View Code? Open in Web Editor NEWA SDWebImage plugin to support Photos framework image loading
License: MIT License
A SDWebImage plugin to support Photos framework image loading
License: MIT License
Please fill in the detailed description about feature request, including the feature use case (what you need) and the solution you want (like usage, demo code, ...)
Info | Value |
---|---|
Platform Name | iOS |
Platform Version | 14.2 |
Framework Version | SDWebImage (5.8.3), SDWebImagePhotosPlugin (1.1.0) |
Integration Method | cocoapods |
Xcode Version | Xcode 12 |
Repro rate | 100% |
Repro with our demo prj | No |
Demo project link | https://github.com/aheze/PhotoLoading |
The collection view scrolls choppily, and the memory goes over 1 gb, depending on how many photos you have. It sometimes also crashes due to Terminated due to memory error
.
I followed the example project (it's in Objective-C so I probably misread some things), first doing this inside viewDidLoad()
:
//Supports HTTP URL as well as Photos URL globally
SDImageLoadersManager.shared.loaders = [SDWebImageDownloader.shared, SDImagePhotosLoader.shared]
// Replace default manager's loader implementation
SDWebImageManager.defaultImageLoader = SDImageLoadersManager.shared
let options = PHImageRequestOptions()
options.sd_targetSize = CGSize(width: 500, height: 500) /// make sure don't load too big
SDImagePhotosLoader.shared.imageRequestOptions = options
Instead of an array of NSURL
I used an array of PHAsset
:
var allPhotos: PHFetchResult<PHAsset>? = nil
...
PHPhotoLibrary.requestAuthorization { (status) in /// request access inside ViewDidLoad
if status == .authorized {
let fetchOptions = PHFetchOptions()
self.allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
DispatchQueue.main.async {
self.collectionView.reloadData() /// reload collectionview once done
}
}
}
And this is my cellForRowAt
. I make the NSURL
here.
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseID, for: indexPath) as! CollectionViewCell
let asset = allPhotos![indexPath.item]
let photosURL = NSURL.sd_URL(with: asset)
cell.imageView.sd_setImage(with: photosURL as URL?, placeholderImage: nil, options: SDWebImageOptions.fromLoaderOnly)
return cell
}
My full code is all in ViewController.swift
(63 lines). What am I doing wrong? Thanks for any help!
2018-09-04 18:31:24.318357+0530 [1690:202387] Task <65A83068-4467-4DBA-B035-720EBB27A59A>.<7> finished with error - code: -1002
2018-09-04 18:31:24.337494+0530 [1690:202405] Task <65A83068-4467-4DBA-B035-720EBB27A59A>.<7> load failed with error Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo={NSLocalizedDescription=unsupported URL, NSErrorFailingURLStringKey=photos://asset/82CCD013-F7E9-461F-8F36-5E3A4FCAD6BB/L0/001, NSErrorFailingURLKey=photos://asset/82CCD013-F7E9-461F-8F36-5E3A4FCAD6BB/L0/001, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <65A83068-4467-4DBA-B035-720EBB27A59A>.<7>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <65A83068-4467-4DBA-B035-720EBB27A59A>.<7>, NSUnderlyingError=0x281b02ac0 {Error Domain=kCFErrorDomainCFNetwork Code=-1002 "(null)"}} [-1002]
In the demo project, as in mine, when you reload the collectionview, the pictures flicker, when I reload only visible cells, this does not happen, but some cells remain not updated when scrolling. Are there any ways to solve this?
Originally posted by @Akumma in openstreetmap/iD#8432
Info | Value |
---|---|
Platform Name | ios |
Platform Version | 14.4 |
Framework Version | 1.2.0 |
Integration Method | carthage |
Xcode Version | Xcode 12.4 |
Repro rate | all the time (100%) |
Repro with our demo prj | |
Demo project link |
github "SDWebImage/SDWebImage"
github "SDWebImage/SDWebImagePhotosPlugin"
carthage update --platform iOS --use-xcframeworks --cache-builds
*** Fetching SDWebImage
*** Fetching SDWebImagePhotosPlugin
*** Checking out SDWebImage at "5.11.1"
*** Checking out SDWebImagePhotosPlugin at "1.2.0"
*** xcodebuild output can be found in /var/folders/zr/4r0p2kpd4gg0thfj05jldkgc0000gn/T/carthage-xcodebuild.a4iK05.log
*** Valid cache found for SDWebImage, skipping build
*** No cache found for SDWebImagePhotosPlugin, building with all downstream dependencies
*** Building scheme "SDWebImagePhotosPlugin" in SDWebImagePhotosPlugin.xcodeproj
Build Failed
Task failed with exit code 65:
/usr/bin/xcrun xcodebuild -project /Users/venice/projects/CarthageTest/Carthage/Checkouts/SDWebImagePhotosPlugin/SDWebImagePhotosPlugin.xcodeproj -scheme SDWebImagePhotosPlugin -configuration Release -derivedDataPath /Users/venice/Library/Caches/org.carthage.CarthageKit/DerivedData/12.4_12D4e/SDWebImagePhotosPlugin/1.2.0 -sdk iphoneos ONLY_ACTIVE_ARCH=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES archive VALIDATE_WORKSPACE=NO -archivePath /var/folders/zr/4r0p2kpd4gg0thfj05jldkgc0000gn/T/SDWebImagePhotosPlugin SKIP_INSTALL=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=NO CLANG_ENABLE_CODE_COVERAGE=NO STRIP_INSTALLED_PRODUCT=NO (launched in /Users/venice/projects/CarthageTest/Carthage/Checkouts/SDWebImagePhotosPlugin)
This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: /var/folders/zr/4r0p2kpd4gg0thfj05jldkgc0000gn/T/carthage-xcodebuild.a4iK05.log
✘ venice ~/projects/CarthageTest
Only support PHAssetMediaTypeImage
pls support PHAssetMediaTypeVideo too
Crashed with beta4 and beta6.
Example of request:
let requestOptions = PHImageRequestOptions()
requestOptions.sd_targetSize = targetSize
requestOptions.sd_contentMode = .aspectFill
requestOptions.isNetworkAccessAllowed = true
if let url = NSURL.sd_URL(with: asset) as URL? {
sd_setImage(with: url,
placeholderImage: nil,
context: [.photosImageRequestOptions: requestOptions,
.customManager: SDWebImagePhotosLoader.shared])
} else {
sd_cancelCurrentImageLoad()
image = nil
}
Since Photos Library image is already stored on the device disk. And query speed is fast enough for small resolution image. You can use SDWebImageContextStoreCacheType with SDImageCacheTypeNone to disable cache storage. And use SDWebImageFromLoaderOnly to disable cache query.
This does not load image sometimes in the SDAnimatedImageView.
Currently, you make a NSURL
from PHAsset
like this:
// Create with `PHAsset`
let asset: PHAsset
let photosURL = NSURL.sd_URL(with: asset)
// Load image (assume using custom manager)
imageView.sd_setImage(with: photosURL, placeholderImage: nil, context: [.customManager: manager])
However, sd_setImage(with:
takes a URL
, not NSURL
.
I would like to be able to get a URL
from PHAsset
, something like this:
// Create with `PHAsset`
let asset: PHAsset
let photosURL = URL.sd_URL(with: asset) /// URL not NSURL
// Load image (assume using custom manager)
imageView.sd_setImage(with: photosURL, placeholderImage: nil, context: [.customManager: manager])
This would avoid the error, and I think URLs are safer than NSURLs.
Hi! I wonder if it is possible to get completion block after photo loading was completed for following method:
imageView.sd_setImage(with: photoURL, placeholderImage: nil, context [.photosImageRequestOptions: requestOptions])
Thanks in advance!
I am seeing the same issue using SDWebImage version 5.3.2, cocoapods, Xcode 12. Crashes are appearing on iOS 14+, does not appear to be happening below iOS 14.
Originally posted by @poiuyqwert in SDWebImage/SDWebImage#3124 (comment)
This pod should really attempt to use the stable version of SDWebImage if possible. I cannot use this even though it would be useful because I will not update my SDWebImage dependency to a beta version.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.