2016-11-26 5 views
2

Ich versuche, eine Aktion abzuschließen, nachdem die URLSession fortgesetzt wurde.Swift - Abgeschlossene Aktion nach NSURLSession wird fortgesetzt

Also ich lade mehrere Bilder von meinem Server mit der URL, die alle gut funktioniert. Aber jetzt versuche ich, diese Bilder auf die Festplatte zu speichern, nachdem ich sie heruntergeladen habe.

Problem

Jetzt kann ich sie in der gleichen Abfrage speichern, während sie heruntergeladen, aber ich würde nicht bevorzugen, da es meine Abfrage langsamer macht.

Also habe ich einen Complete-Handler zu meinem func mit der Abfrage hinzugefügt, aber wenn ich die Bilder auf dem Datenträger in diesem Block speichern, funktioniert es, aber ich kann nichts mit meinem Bildschirm tun, da die Abfrage noch nicht wieder aufgenommen wurde von Berührungen ich denke ...

Jetzt möchte ich in der Lage sein, meine Funktion zu rufen, um die Bilder auf der Festplatte zu speichern, direkt nachdem die Abfrage wieder aufgenommen wurde .... Wer hat eine Idee?

Wenn jemand mehr Erklärung braucht oder sehen Code werfen Sie einfach einen Kommentar unter

Vielen Dank im Voraus für jeden, der helfen kann!

-Code zum Download

func loadPosts(completionHandler: @escaping (Bool) ->()) { 

     pageNumber = 1 
     appDelegate.setNetworkActivityIndicatorVisible(true) 

     let id = user!["id"] as! String 
     let url = URL(string: "http://************/Files/Posts.php")! 
     var request = URLRequest(url: url) 
     request.httpMethod = "POST" 
     let body = "id=\(id)&caption=&uuid=&page=" 
     request.httpBody = body.data(using: String.Encoding.utf8) 
     let task = URLSession.shared.dataTask(with: request, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) in 

      DispatchQueue.global(qos: .background).async { 
       if error == nil { 

        let oldImageArray = self.cellContentArray 
        self.cellContentArray.removeAll(keepingCapacity: false) 


        do { 
         let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 

         guard let parseJSON = json else { 
          print("Error while parsing") 
          return 
         } 
         guard let posts = parseJSON["Posts"] as? [AnyObject] else { 
          print("Error while parseJSONing") 
          return 
         } 
         for element in posts { 
          // here I download the stuff and it to my Array, too long and no point to show here 

         } 

         let oldImageSet = Set(oldImageArray.map({return $0.uuid})) 
         let newImageSet = Set(self.cellContentArray.map({return $0.uuid})) 
         let addedImages = newImageSet.subtracting(oldImageSet) 
         let addedImageSections = Array(addedImages).map{ self.cellContentArray.map({return $0.uuid}).index(of: $0)! } 
         let addedImageIndexSet = IndexSet(addedImageSections) 
         let removedImages = oldImageSet.subtracting(newImageSet) 
         let removedImageSections = Array(removedImages).map{ oldImageArray.map({return $0.uuid}).index(of: $0)! } 
         let removedImageIndexSet = IndexSet(removedImageSections) 


         if !addedImageIndexSet.isEmpty { 
          if oldImageArray.count >= 5 { 
          self.lastUUIDImage = oldImageArray[4].uuid 
          } else { 

          } 
          self.coreDataShit() 
         } 
         DispatchQueue.main.async{ 
          print(placeholderImage.count) 
          if placeholderImage.count > 5 { 
           placeholderImage.removeFirst(placeholderImage.count - 5) 
          } 
          print("finished") 
          self.customView.isHidden = true 
          if posts.count >= 5 { 
           self.tableView.addInfiniteScroll { [weak self] (scrollView) -> Void in 
            self?.loadMore() 
           }} 
          self.activityView.stopAnimating() 
          self.internetView.removeFromSuperview() 



          self.tableView.beginUpdates() 
          if !addedImageIndexSet.isEmpty { 
           self.tableView.insertSections(addedImageIndexSet, with: .top) 
          } 
          if !removedImageIndexSet.isEmpty { 
           self.tableView.deleteSections(removedImageIndexSet, with: .bottom) 
          } 
          self.tableView.endUpdates() 
          self.tableView.finishInfiniteScroll() 
          self.refresher.endRefreshing() 
          appDelegate.setNetworkActivityIndicatorVisible(false) 
          completionHandler(true) 

         } 
        } catch { 
         DispatchQueue.main.async { 
          self.tableView.removeInfiniteScroll() 
          self.customView.isHidden = false 
          self.refresher.endRefreshing() 
          self.tableView.reloadData() 
         } 
        } 


       } else { 
        DispatchQueue.main.async(execute: { 
         let message = error!.localizedDescription 
         appDelegate.infoView(message: message, color: smoothRedColor) 
        }) 
       } 
      } 
     }) 
     task.resume() 

    } 

Speichern von Bild

self.loadPosts(completionHandler: { (true) in 
       print("completion") 

       let sections = self.tableView.numberOfSections 
       for i in 0..<sections { 
        self.rows += self.tableView.numberOfRows(inSection: i) 
       } 

       print(self.rows) 

       if self.rows <= 5 { 
        print("less than 5") 
        print(self.rows) 
        var i = 0 

        for element in self.cellContentArray { 

         let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String 
         let dirPath = "\(path)/images" 
         let url = NSURL(fileURLWithPath: dirPath) 
         let filePath = url.appendingPathComponent("\(element.uuid).jpg")?.path 
         let fileManager = FileManager.default 
         if fileManager.fileExists(atPath: filePath!) { 
          print("File exsists") 

         } else { 
          print("File doesn't exsist") 
          DispatchQueue.main.async { 

           let url = NSURL(string: element.fullImage!)! // convert path str to url 
           let imageData = NSData(contentsOf: url as URL) // get data via url and assigned imageData 
           let imageName = element.uuid 
           let saveImages = FileSaveHelper(fileName: imageName, fileExtension: .JPG, subDirectory: "images", directory: .documentDirectory) 
           do { 
            guard let image = UIImage.sd_image(with: imageData as Data!) else { 
             print("Error getting image") 
             return 
            } 
            try saveImages.saveFile(image: image) 
            self.saveNewImagePath(imageLink: imageName, uuid: imageName) 
            self.removeImage(itemName: "file\(i)", fileExtension: "jpg") 
            self.removeImage(itemName: self.lastUUIDImage, fileExtension: "jpg") 

            i += 1 

           } catch { 
            print(error) 
           } 
          } 
         } 

        } 
       } 

      }) 

Bild in Tableview Zelle

self.postImage.sd_setImage(with: URL(string: content.fullImage!), placeholderImage: placeHolder, options: .retryFailed) { (image:UIImage?, error:Error?, cached:SDImageCacheType, url:URL?) in 

      } 
+0

mit der Wenn Sie Ihre Bilder in den Haupt sind das Herunterladen Thread, dann wird es sicher Ihre Benutzeroberfläche blockieren. Laden und speichern Sie Bilder asynchron, dann wird Ihre Benutzeroberfläche nicht blockiert. – Rajat

+0

Ach ja, der Versand Async verursacht das Problem? Ist das nicht notwendig? –

+0

@Rajat Ich habe dies in der nsurl Anfrage DispatchQueue.global (qos: .background) .async { und dann das, wenn ich das tableView DispatchQueue.main.async { –

Antwort

1

In Ihrem Code Bild diese Codezeile des Sparens blockiert Sie

UI
let imageData = NSData(contentsOf: url as URL) // get data via url and assigned imageData 

Dies ist nicht die richtige Art und Weise Bild vom Server herunterzuladen, sollten Sie Bild herunterladen asynchron URLSession

+0

Aber ich bekomme nur den Link nicht das aktuelle Bild in meiner Abfrage, also muss ich es trotzdem herunterladen –

+0

Entschuldigung dafür, bekomme ich das und bearbeite meine Antwort. – Rajat

+0

Nun, ich lade nur das Bild dort, um es auf dem Gerätesystem zu speichern. Ich lade tatsächlich das Bild in der Zelle mit sdwebimage, aber das lädt nur das Bild, wenn die Zelle sichtbar ist, und ich möchte die Bilder auf dem Gerät speichern können, ohne durch die Zellen scrollen zu müssen? irgendeine Idee einer anderen Lösung? –

Verwandte Themen