Swift - NSURLSession恢复后的完整操作

时间:2016-11-26 18:05:51

标签: ios swift nsurlsession

我正在尝试在URLSession恢复后完成一个动作。

所以我使用url从我的服务器下载了几张图片,这些都很好用。但是现在我尝试在下载完毕后将这些图像保存到磁盘上。

问题

现在我可以在下载时将它们保存在同一个查询中,但我不想这样做,因为它会使我的查询变慢。

所以我用查询为我的func添加了一个完成处理程序,但是当我将图像保存到该块中的磁盘时,它可以正常工作,但我无法对我的屏幕做任何事情,因为查询尚未恢复,但它已被阻止接触我猜...

现在我希望能够在恢复查询后立即调用我的func将图像保存到磁盘....任何人都有任何想法?

如果有人需要更多解释或看到代码,请在下方发表评论

非常感谢任何有帮助的人!

下载代码

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()

    }

保存图片

   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)
                                }
                            }
                        }

                    }
                }

            })

tableView Cell中的图像

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

           }

1 个答案:

答案 0 :(得分:1)

在您保存图片的代码中,这行代码阻止了您的用户界面

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

这不是从服务器下载图像的正确方法,您应该使用URLSession

异步下载图像