0

In my application I download files of various formats. I'm trying to get the UIDocumentInteractionController to get the applications that can open this format. The problem is that the UIDocumentInteractionController is not working. This is my code:

func loadArchiveAtIndex(sender: NSNotification){
        let itemIndex = sender.userInfo!["index"] as! Int
        let archiveKey = sender.userInfo!["downloadKey"] as! String

        self.downloadingItens.append(itemIndex)
        print(archiveKey)

        let qualityOfServiceClass = QOS_CLASS_BACKGROUND
        let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
        dispatch_async(backgroundQueue, {

            SQLiteDataController().getTokenSincronismo({
                (Valido, Retorno, Token, Tipo) -> Void in
                if Valido == true{
                    switch Retorno {
                    case 9: // Retorno Válido
                        print(Token)

                        let params = [
                            "tokenSincronizacao":"\(Token)",
                            "chaveProdutoBiblioteca":"\(archiveKey)"
                        ]
                        Alamofire.request(.GET, "\(_URLPREFIX)/ObtemProdutoBiblioteca", parameters: params).responseJSON { (response) in
                            if response.result.isFailure {
                                print(response.result.error)
                            } else {
                                let result = response.result.value
                                if let archive = result?["ProdutoBiblioteca"] as? NSDictionary{
                                    let bytes = archive.objectForKey("Arquivo") as! String
                                    let name = archive.objectForKey("NomeArquivo") as! String
                                    let data = NSData.init(base64EncodedString: bytes, options: .IgnoreUnknownCharacters)
                                    let url = NSURL.init(string: name.lowercaseString)
                                    data?.writeToURL(url!, atomically: true)

                                    let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
                                    let fileURL = documents.URLByAppendingPathComponent((name.lowercaseString))
                                    print(fileURL)

                                    let dic = UIDocumentInteractionController.init(URL: fileURL!)
                                    dic.delegate = self
                                    dic.presentPreviewAnimated(true)
//
                                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                                        var arrayIndex = 0
                                        for item in self.downloadingItens {
                                            let i = item
                                            if i == itemIndex {
                                                self.downloadingItens.removeAtIndex(arrayIndex)
                                                NSNotificationCenter.defaultCenter().postNotificationName("reloadTable", object: nil, userInfo: ["itens":self.downloadingItens])
                                                break
                                            }
                                            arrayIndex = arrayIndex + 1
                                        }
                                    })

                                }
                            }
                        }

                        break
                    default:
                        self.showError("Atenção", message: "Não foi Possivel Processar a sua Solicitação")
                        break
                    }
                }else{
                    self.showError("Atenção", message: "Não foi Possivel Processar a sua Solicitação")
                }
                }, sincFull:true)
        })
    }

    func documentInteractionControllerViewForPreview(controller: UIDocumentInteractionController) -> UIView? {
            return self.view
        }

What am I doing wrong?

5
  • Would you be willing to post the full class to give a little more context? Commented May 5, 2017 at 18:08
  • I edited the code Commented May 5, 2017 at 18:21
  • What Type of class are these functions in though? Commented May 5, 2017 at 18:23
  • More likely than not your problem stems from trying to invoke the UIDocumentInteractionController from a thread other than the main thread. I recommend that in each of your blocks you do what you need to do to extract data and then pass that data back to a block you run on the main thread to handle the UI interaction. Commented May 5, 2017 at 18:24
  • @DonovanKing This in my UIViewController Commented May 5, 2017 at 18:36

1 Answer 1

1

You need to present the view from the main thread.

Instead of:

let dic = UIDocumentInteractionController.init(URL: fileURL!)
dic.delegate = self
dic.presentPreviewAnimated(true)

Try:

dispatch_async(dispatch_get_main_queue(), { () -> Void in
   let dic = UIDocumentInteractionController.init(URL: fileURL!)
   dic.delegate = self
   dic.presentPreviewAnimated(true)                                    
})
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.