Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件文件夹在模拟器中工作,但不是iPad-Swift 2.1_Swift_Ios Simulator_Unzip_Nsfilemanager_Documents - Fatal编程技术网

文件文件夹在模拟器中工作,但不是iPad-Swift 2.1

文件文件夹在模拟器中工作,但不是iPad-Swift 2.1,swift,ios-simulator,unzip,nsfilemanager,documents,Swift,Ios Simulator,Unzip,Nsfilemanager,Documents,下面的代码将图像文件夹解压缩到我创建的文件夹中。然后循环遍历并将名称添加到数组中,然后循环遍历此数组并将这些文件名检索到图像数组中 它在模拟器上运行得很好,但当我在iPad上运行时,数据是空的,它什么也不输出。我只能假设在解压完成之前文件夹不可访问或正在搜索,但它不应该,因为我正在使用带有完成块的NSOperationQueue func unzipData(objectData: NSManagedObject) { var paths = NSSearchPathForDir

下面的代码将图像文件夹解压缩到我创建的文件夹中。然后循环遍历并将名称添加到数组中,然后循环遍历此数组并将这些文件名检索到图像数组中

它在模拟器上运行得很好,但当我在iPad上运行时,数据是空的,它什么也不输出。我只能假设在解压完成之前文件夹不可访问或正在搜索,但它不应该,因为我正在使用带有完成块的NSOperationQueue

func unzipData(objectData: NSManagedObject) {
        var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
        let documentsDir = paths[0]
        let zipPath = documentsDir.stringByAppendingString("MyZipFiles")
        let folderPath = documentsDir.stringByAppendingString("/docLibFiles") // My folder name in document directory
        var optData = NSData(data: objectData.valueForKey("image") as! NSData)
        print(objectData.valueForKey("imageUrl") as! String)
        optData.writeToFile(zipPath, atomically: true)
        let success = fileManager.fileExistsAtPath(zipPath) as Bool
        if success == false {
            do {
                try! fileManager.createDirectoryAtPath(folderPath, withIntermediateDirectories: true, attributes: nil)
            }
        }
        queue.addOperationWithBlock { () -> Void in
            let operation1 = NSBlockOperation(block: {
                let unZipped = SSZipArchive.unzipFileAtPath(zipPath, toDestination: folderPath)

            })
            operation1.completionBlock = {
                    dispatch_async(dispatch_get_main_queue(), {
                        if queue.operationCount == 0 {
                            self.retrieveFiles()
                        }
                    })
            }
            queue.addOperation(operation1)
        }
    }

    func getDocumentsURL() -> NSURL {
        let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
        return documentsURL
    }

    func fileInDocumentsDirectory(filename: String) -> String {
        let fileURL = getDocumentsURL().URLByAppendingPathComponent(filename)
        return fileURL.path!
    }

    func retrieveFiles() {
        var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
        let documentsDir = paths[0]
        let zipPath = documentsDir.stringByAppendingString("MyZipFiles")
        let folderPath = documentsDir.stringByAppendingString("/docLibFiles") // My folder name in document directory
        do {
            let filelist = try fileManager.contentsOfDirectoryAtPath(folderPath)
            print(filelist)
            print("filename")
            for filename in filelist {
                fileNameArray.append(filename)
            }
        } catch let error as NSError  {
            print("Could not save \(error)")
        }
        do {
            for item in fileNameArray {
                print("item \(item)")
                let imagePath = fileInDocumentsDirectory("docLibFiles/\(item)")
                imageArray.append(UIImage(contentsOfFile: imagePath)!)
            }
            print("filename array \(fileNameArray)")
            print("image array \(imageArray)")
            unzipDelegate!.unzipSet(imageArray)
        }
    }

为了避免错误,一些琐碎的打字错误会产生错误。可能以NSURL形式处理路径



    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDir = paths[0]
    let url = NSURL(fileURLWithPath: documentsDir)
    url.URLByAppendingPathComponent("MyZipFiles")
    url.URLByAppendingPathComponent("docLibFiles")


我不太清楚最初的问题为什么会出现,但我的代码肯定过于复杂了。我现在已经整理好了,希望它能帮助swift 2.1中的其他人

class UnzipDocument {
let queue = NSOperationQueue() // BACKGROUND THREAD
    var imageArray = [UIImage]()
    var fileNameArray = [String]()
    var fileManager = NSFileManager.defaultManager()

let compressedFile = NSTemporaryDirectory().stringByAppendingString("MyZipFiles")
let uncompressedFolder = NSTemporaryDirectory().stringByAppendingString("MyUnzippedFiles")

func unzipData(objectData: NSManagedObject){ // THIS IS BASICALLY NSDATA FROM CORE DATA FOR ME
    let optData = NSData(data: objectData.valueForKey("image") as! NSData)
    let success = fileManager.fileExistsAtPath(uncompressedFolder) as Bool // CREATES THE FOLDER IF IT DOESNT EXIST
    if success == false {
        do {
            try! fileManager.createDirectoryAtPath(uncompressedFolder, withIntermediateDirectories: true, attributes: nil)
        }
    }
    optData.writeToFile(compressedFile, atomically: true)
    queue.addOperationWithBlock { () -> Void in
        let operation1 = NSBlockOperation(block: {
            SSZipArchive.unzipFileAtPath(self.compressedFile, toDestination: self.uncompressedFolder)
        })
        operation1.completionBlock = {
            if queue.operationCount == 0 {
                dispatch_async(dispatch_get_main_queue(), {
                    if queue.operationCount == 0 {
                        self.retrieveFiles()
                    }
                })
            }
        }
        queue.addOperation(operation1)
    }
}

func retrieveFiles() {
    do {
        let filelist = try fileManager.contentsOfDirectoryAtPath(uncompressedFolder)
        print(filelist)
        print("filename")
        for filename in filelist {
            self.fileNameArray.append(filename)
        }
    } catch let error as NSError  {
        print("Could not save \(error)")
    }
    do {
        for item in fileNameArray {
            print("item \(item)")
            let imagePath = uncompressedFolder.stringByAppendingString("/\(item)")
            imageArray.append(UIImage(contentsOfFile: imagePath)!)
        }
        print("filename array \(fileNameArray)")
        print("image array \(imageArray)")
        unzipDelegate!.unzipSet(imageArray)
    } catch {
    }
} 
}
以及在使用后删除临时文件/文件夹,以便在不保留任何旧文档的情况下重复使用

var fileManager = NSFileManager.defaultManager()
        let compressedFile = NSTemporaryDirectory().stringByAppendingString("MyZipFiles")
        let uncompressedFolder = NSTemporaryDirectory().stringByAppendingString("MyUnzippedFiles")
        do {
           try fileManager.removeItemAtPath(compressedFile)
              try fileManager.removeItemAtPath(uncompressedFolder)
        } catch let error as NSError  {
            print("Could not save \(error)")
        }

快速浏览代码,可能需要在MyZipFiles前面加一个斜杠:让zipPath=documentsDir.stringByAppendingString(“/MyZipFiles”)干杯@Allen,这有点奇怪。我想有人可能会注意到这一点(该位实际上没有做任何事情,它不会创建文件夹或文件,但解压只有在我将其保留在中时才起作用,我认为它需要一个与其现有位置不相同的指针)播放字符串路径可能会导致一个错误,错误很小。可能是以NSURL形式处理路径,请参考我的答案。再次感谢@Allen,但我使用的解压码使用字符串路径。我可以用你的代码创建文件夹,但无论如何都要切换回去。另外,文件夹的名称总是相同的,所以打字不应该是一个问题