Skip to content

Instantly share code, notes, and snippets.

@ahmedAlmasri
Last active March 23, 2020 08:15
Show Gist options
  • Select an option

  • Save ahmedAlmasri/d4deba1378b6fa34f920bc5217f06a4c to your computer and use it in GitHub Desktop.

Select an option

Save ahmedAlmasri/d4deba1378b6fa34f920bc5217f06a4c to your computer and use it in GitHub Desktop.

Revisions

  1. ahmedAlmasri revised this gist Mar 23, 2020. 3 changed files with 488 additions and 0 deletions.
    275 changes: 275 additions & 0 deletions PhotoOperation.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,275 @@


    class PhotoOperation:TestOP {


    var albumName = ""
    var photoAssets = PHFetchResult<PHAsset>()
    var assetCollection: PHAssetCollection?
    var albumFound = false

    let disQ = DispatchGroup()


    override func main() {
    guard isCancelled == false else {

    finish(true)
    return
    }

    // executing(true)
    //getSyncPhotos()

    // disQ.enter()

    //req()
    // getSyncPhotos()

    // DispatchQueue.global().async {
    // for i in 0..<1000000{
    // print(i)
    //
    //
    // }
    //
    // self.disQ.leave()
    // }
    //
    // disQ.enter()
    // DispatchQueue.global().async {
    // for i in 0..<100{
    // print("AAAAAAAAAA \(i)")
    //
    // }
    //
    // self.disQ.leave()
    // }
    //
    // disQ.notify(queue: DispatchQueue.main) {
    // print("call disQ")
    // self.executing(false)
    // self.finish(true)
    //
    // }

    for i in 0...10 {
    print("Fetching Photo \(i)" )
    self.pausedBlock()

    guard isCancelled == false else {

    finish(true)
    return
    }

    sleep(1)
    }
    executing(false)
    finish(true)

    }
    //
    // }


    func req(){

    PHPhotoLibrary.requestAuthorization { (status) in
    switch status {
    case .authorized:
    print("Good to proceed")
    // let fetchOptions = PHFetchOptions()
    // let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
    // print("Found \(allPhotos.count) images")
    self.getSyncPhotos()
    case .denied, .restricted:
    print("Not allowed")
    case .notDetermined:
    print("Not determined yet")
    }
    }

    }

    func getSyncPhotos()
    {


    self.albumName = String(1)

    //let fetchOptions = PHFetchOptions()
    // fetchOptions.predicate = NSPredicate(format: "title = %@", self.albumName)
    let collection:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)

    if let _:AnyObject = collection.firstObject{
    //found the album
    self.assetCollection = collection.firstObject
    self.albumFound = true
    }
    else { albumFound = false }
    _ = collection.count
    let options = PHFetchOptions()

    options.predicate = NSPredicate(format: "mediaType == %d || mediaType == %d",
    PHAssetMediaType.image.rawValue,
    PHAssetMediaType.video.rawValue)

    self.photoAssets = PHAsset.fetchAssets(in: self.assetCollection!, options: options)
    let imageManager = PHCachingImageManager()

    self.photoAssets.enumerateObjects{(object: AnyObject!,
    count: Int,
    stop: UnsafeMutablePointer<ObjCBool>) in

    if object is PHAsset{
    let asset = object as! PHAsset

    let imageSize = CGSize(width: asset.pixelWidth,
    height: asset.pixelHeight)

    /* For faster performance, and maybe degraded image */
    let options = PHImageRequestOptions()
    options.deliveryMode = .fastFormat
    // options.isSynchronous = true
    imageManager.requestImage(for: asset,
    targetSize: imageSize,
    contentMode: .aspectFill,
    options: options,
    resultHandler: {
    image, info in
    // self.photo = image!
    /* The image is now available to us */
    // self.getSyncPhotos(self.photo)
    print("load image ...")

    self.pausedBlock()
    //

    })


    }
    }


    //print("Finsh Operation ......... ")
    }
    }

    class ContactOperation:TestOP {

    var albumName = ""
    var photoAssets = PHFetchResult<PHAsset>()
    var assetCollection: PHAssetCollection?
    var albumFound = false

    let disQ = DispatchGroup()


    override func main() {



    for i in 0...10 {
    print("Fetching Contact \(i)" )
    self.pausedBlock()
    guard isCancelled == false else {

    finish(true)
    return
    }
    sleep(1)
    }
    executing(false)
    finish(true)

    }
    //
    // }



    func req(){

    PHPhotoLibrary.requestAuthorization { (status) in
    switch status {
    case .authorized:
    print("Good to proceed")
    // let fetchOptions = PHFetchOptions()
    // let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
    // print("Found \(allPhotos.count) images")
    self.getSyncPhotos()
    case .denied, .restricted:
    print("Not allowed")
    case .notDetermined:
    print("Not determined yet")
    }
    }

    }

    func getSyncPhotos()
    {


    self.albumName = String(1)

    //let fetchOptions = PHFetchOptions()
    // fetchOptions.predicate = NSPredicate(format: "title = %@", self.albumName)
    let collection:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)

    if let _:AnyObject = collection.firstObject{
    //found the album
    self.assetCollection = collection.firstObject
    self.albumFound = true
    }
    else { albumFound = false }
    _ = collection.count
    let options = PHFetchOptions()

    options.predicate = NSPredicate(format: "mediaType == %d || mediaType == %d",
    PHAssetMediaType.image.rawValue,
    PHAssetMediaType.video.rawValue)

    self.photoAssets = PHAsset.fetchAssets(in: self.assetCollection!, options: options)
    let imageManager = PHCachingImageManager()

    self.photoAssets.enumerateObjects{(object: AnyObject!,
    count: Int,
    stop: UnsafeMutablePointer<ObjCBool>) in

    if object is PHAsset{
    let asset = object as! PHAsset

    let imageSize = CGSize(width: asset.pixelWidth,
    height: asset.pixelHeight)

    /* For faster performance, and maybe degraded image */
    let options = PHImageRequestOptions()
    options.deliveryMode = .fastFormat
    // options.isSynchronous = true
    imageManager.requestImage(for: asset,
    targetSize: imageSize,
    contentMode: .aspectFill,
    options: options,
    resultHandler: {
    image, info in
    // self.photo = image!
    /* The image is now available to us */
    // self.getSyncPhotos(self.photo)
    print("load image ...")

    self.pausedBlock()
    //

    })


    }
    }


    //print("Finsh Operation ......... ")
    }
    }
    78 changes: 78 additions & 0 deletions ViewController.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,78 @@

    class ViewController: UIViewController {
    var photoOperation = PhotoOperation()
    var photoOperation2 = PhotoOperation2()

    private let operationQueue: OperationQueue = OperationQueue()


    override func viewDidLoad() {
    super.viewDidLoad()

    }

    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    //https://web.facebook.com/profile.php?id=100002845497398
    let url : URL!
    if (UIApplication.shared.canOpenURL(URL(string:"fb://")!)) {
    //FIXME: Url is not working ✋
    let pageName = "104958162837"
    // tried with fb://page?name=%@ not worked
    let urlString = String.init(format: "fb://profile/%@",pageName)
    url = URL.init(string: urlString)
    } else {
    url = URL.init(string: "https://www.facebook.com/104958162837")
    }

    if #available(iOS 10.0, *) {
    UIApplication.shared.open(url!, completionHandler: nil)
    } else {
    UIApplication.shared.openURL(url!)
    }
    }

    @IBAction func stop(_ sender:UIButton){
    photoOperation.pause()

    }

    @IBAction func stRT(_ sender:UIButton){
    photoOperation.resume()

    }

    @IBAction func startOps(_ sender: Any) {
    DispatchQueue.global().async {
    self.photoOperation.completionBlock = {
    print("end Photos operation Completed ")
    }

    let contactOP = ContactOperation()

    // contactOP.addDependency(photoOperation)

    contactOP.completionBlock = {
    print("Contacts finished")
    }

    self.operationQueue.addOperations([self.photoOperation,contactOP], waitUntilFinished: true)

    DispatchQueue.main.async {
    print("Both Ops Finished")


    }
    }

    print ("Ops Started")
    }

    @IBAction func cancelTapped(_ sender: Any) {
    operationQueue.cancelAllOperations()
    }



    }

    135 changes: 135 additions & 0 deletions temp.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,135 @@


    import Foundation
    import Photos


    class PhotoOperation2:Operation {

    private var _finished = false {
    willSet {
    willChangeValue(forKey: "isFinished")
    }

    didSet {
    didChangeValue(forKey: "isFinished")
    }
    }

    private var _executing = false {
    willSet {
    willChangeValue(forKey: "isExecuting")
    }
    didSet {
    didChangeValue(forKey: "isExecuting")
    }
    }

    func executing(_ executing: Bool) {
    _executing = executing
    }


    func finish(_ finished: Bool) {
    _finished = finished
    }

    var albumName = ""
    var photoAssets = PHFetchResult<PHAsset>()
    var assetCollection: PHAssetCollection?
    var albumFound = false




    override func main() {
    guard isCancelled == false else {

    finish(true)
    return
    }

    executing(true)
    req()
    }


    func req(){

    PHPhotoLibrary.requestAuthorization { (status) in
    switch status {
    case .authorized:
    print("Good to proceed")
    // let fetchOptions = PHFetchOptions()
    // let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
    // print("Found \(allPhotos.count) images")
    self.getSyncPhotos()
    case .denied, .restricted:
    print("Not allowed")
    case .notDetermined:
    print("Not determined yet")
    }
    }

    }

    func getSyncPhotos()
    {

    print("start 22222")

    self.albumName = String(1)

    //let fetchOptions = PHFetchOptions()
    // fetchOptions.predicate = NSPredicate(format: "title = %@", self.albumName)
    let collection:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: nil)

    if let _:AnyObject = collection.firstObject{
    //found the album
    self.assetCollection = collection.firstObject
    self.albumFound = true
    }
    else { albumFound = false }
    _ = collection.count
    self.photoAssets = PHAsset.fetchAssets(in: self.assetCollection!, options: nil)
    let imageManager = PHCachingImageManager()

    self.photoAssets.enumerateObjects{(object: AnyObject!,
    count: Int,
    stop: UnsafeMutablePointer<ObjCBool>) in

    if object is PHAsset{
    let asset = object as! PHAsset

    let imageSize = CGSize(width: asset.pixelWidth,
    height: asset.pixelHeight)

    /* For faster performance, and maybe degraded image */
    let options = PHImageRequestOptions()
    options.deliveryMode = .fastFormat
    // options.isSynchronous = true
    imageManager.requestImage(for: asset,
    targetSize: imageSize,
    contentMode: .aspectFill,
    options: options,
    resultHandler: {
    image, info in
    // self.photo = image!
    /* The image is now available to us */
    // self.getSyncPhotos(self.photo)
    print("load image ... 222222222 >>>>>>> :)")
    // sleep(5)


    })



    }
    }

    self.executing(false)
    self.finish(true)
    print("Finsh Operation ......... 22222222222 ")
    }
    }
  2. ahmedAlmasri created this gist Jul 1, 2019.
    91 changes: 91 additions & 0 deletions BaseOperation.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,91 @@
    //
    // BaseUploadOperation.swift
    // UHive
    //
    // Created by Ahmad AlMasri on 6/27/19.
    // Copyright © 2019 Genie9. All rights reserved.
    //

    import Foundation

    class BaseOperation: Operation {
    // MARK:- Declarations
    private var pauseCondition:NSCondition!

    var isStarted = false
    var paused:Bool = false

    var collectionCompleted:NSCondition

    private var _executing = false {
    willSet {
    willChangeValue(forKey: "isExecuting")
    }
    didSet {
    didChangeValue(forKey: "isExecuting")
    }
    }

    private var _finished = false {
    willSet {
    willChangeValue(forKey: "isFinished")
    }
    didSet {
    didChangeValue(forKey: "isFinished")
    }
    }

    override var isExecuting: Bool {
    return _executing
    }

    override var isFinished: Bool {
    return _finished
    }

    // MARK:- Inits
    override init() {
    pauseCondition = NSCondition()
    collectionCompleted = NSCondition()
    }

    // MARK:- Main Transactions
    override func cancel() {
    super.cancel()

    }

    func pause() {
    lockCondition(true)
    }

    func resume() {
    lockCondition(false)
    }

    func waitIfPaused() {
    self.pauseCondition.lock()

    while (paused) {
    self.pauseCondition.wait()
    }
    self.pauseCondition.unlock()
    }

    func executing(_ executing:Bool){
    _executing = executing
    }

    func finish(_ finished:Bool){
    _finished = finished
    }

    // MARK:- Local Functionality
    private func lockCondition(_ pause:Bool){
    self.pauseCondition.lock()
    self.paused = pause
    self.pauseCondition.signal()
    self.pauseCondition.unlock()
    }

    }