BoltsFramework / Bolts-ObjC

Bolts is a collection of low-level libraries designed to make developing mobile apps easier.
Other
5.65k stars 577 forks source link

[Swift 3 | Parse] BFTask(forCompletionOfAllTasksWithResults:) #279

Closed CiraciNicolo closed 2 years ago

CiraciNicolo commented 7 years ago

I'm using Bolts with the Parse SDK on a swift3 project, the issue is relative to Bolts I suppose. I've an array of BFTask and using BFTask(forCompletionOfAllTasksWithResults: tasks) I get the following error:

schermata 2016-09-26 alle 22 24 36

Any ideas how to fix this?

roblav96 commented 7 years ago

@iStopped Ye same issues here. Did you end up getting around this one?

roblav96 commented 7 years ago

@iStopped So far this has been working:

    open func getContactsBolts() -> [BFTask<CNContact>] {
        let task = BFTaskCompletionSource<AnyObject>()

        getContactsAsync( {(contacts: [CNContact], error) in
            if (error == nil) {
                task.setResult(contacts as [CNContact] as AnyObject?)
            } else {
                task.setError(error!)
            }
        })

        let sendi: AnyObject = task.task
        return sendi as! [BFTask<CNContact>]
    }
nishidanagisa commented 7 years ago
    var tasks = [BFTask<AnyObject>]()
    let allTask = BFTask(forCompletionOfAllTasks: tasks)

does not work...

CiraciNicolo commented 7 years ago

I'm having this issue with parse-sdk. I've written an ugly method that accept a closure that almost works without huge modifications.

static func resolverQueriesInBackground(_ queries: [PFQuery<PFObject>], completionBlock: @escaping (BFTask<AnyObject>) -> Void) {

        DispatchQueue(label: "dataProvider").async {

            let queue = OperationQueue()
            var succed = true
            var results: [[PFObject]] = []

            queries.forEach { (query) in

                queue.addOperation({

                    do {
                        let result = try query.findObjects()
                        results.append(result)
                    }
                    catch _ as NSError {
                        succed = false
                    }
                })
            }

            queue.waitUntilAllOperationsAreFinished()

            if succed {

                let task = BFTask<AnyObject>(result: results as AnyObject)
                _ = completionBlock(task)
            }
            else {
                let error = NSError(domain: "kDataProviderDomain", code: 0, userInfo: nil)
                let task = BFTask<AnyObject>(error: error)
                _ = completionBlock(task)
            }
        }
    }
jeremypiednoel commented 7 years ago

I figured out something ugly but it looks like it works

var tasks = [BFTask<AnyObject>]()
BFTask<AnyObject>(forCompletionOfAllTasksWithResults: tasks as [BFTask<AnyObject>]?).continue({ task -> Any? in
    print(task.result)
})