Sample code for 30+ languages & platforms
Swift

Async Methods Returning an Object

See more Async Examples

Demonstrates how to call an asynchronous method that returns an object. This example reads email from a POP3 server using the Async versions of the Chilkat methods.

Chilkat Swift Downloads

Swift

func chilkatTest() {
    var success: Bool = false

    // This example assumes the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    success = false

    let mailman = CkoMailMan()!

    // Set the POP3 server's hostname
    mailman.mailHost = "pop.example.com"

    // Set the POP3 login/password and any other requirements..
    mailman.popUsername = "myLogin"
    mailman.popPassword = "myPassword"
    mailman.popSsl = true
    mailman.mailPort = 995

    // Connect to the POP3 server:
    var task: CkoTask? = mailman.pop3BeginSessionAsync()
    if mailman.lastMethodSuccess == false {
        print("\(mailman.lastErrorText!)")
        return
    }

    // Start the background task.
    success = task!.run()
    if !success {
        print("\(task!.lastErrorText!)")
        task = nil
        return
    }

    // Wait for the POP3 connect task to finish.
    // The true/false returned by Wait applies to the Wait method call, not the task.
    var maxWaitMs: Int = 30000
    success = task!.wait(maxWaitMs: maxWaitMs)
    if !success || (task!.statusInt.intValue != 7) || (task!.taskSuccess != true) {
        if !success {
            // The task.LastErrorText applies to the Wait method call.
            print("\(task!.lastErrorText!)")
        }
        else {
            // The ResultErrorText applies to the underlying task method call (i.e. the Pop3BeginSession)
            print("\(task!.status!)")
            print("\(task!.resultErrorText!)")
        }

        task = nil
        return
    }

    task = nil

    // Get the number of messages in the mailbox.
    task = mailman.getMailboxCountAsync()

    // To keep the example short, we'll skip handling failures.
    // The failures would be handled in the same way as shown above.

    success = task!.run()
    success = task!.wait(maxWaitMs: maxWaitMs)
    var numMessages: Int = task!.getResultInt().intValue
    task = nil
    if numMessages == 0 {
        return
    }

    let email = CkoEmail()!

    var i: Int
    for i = 1; i <= numMessages; i++ {

        task = mailman.fetch(byMsgnumAsync: i)
        if mailman.lastMethodSuccess == false {
            print("\(mailman.lastErrorText!)")
            return
        }

        success = task!.run()
        success = task!.wait(maxWaitMs: maxWaitMs)
        if !success || (task!.statusInt.intValue != 7) || (task!.taskSuccess != true) {
            if !success {
                // The task.LastErrorText applies to the Wait method call.
                print("\(task!.lastErrorText!)")
            }
            else {
                // The ResultErrorText applies to the underlying task method call (i.e. the FetchByMsgnum)
                print("\(task!.status!)")
                print("\(task!.resultErrorText!)")
            }

            task = nil
            return
        }

        // Each Chilkat object that can be a return value of an asynchronous task will
        // have a method named LoadTaskResult.  The object returned in the underlying
        // asynchronous method call is retrieved by calling LoadTaskResult. 

        // To say it another way: The application will provide a pre-existing object of
        // the desired return type (in this case it is an email object).  This object is
        // loaded by calling LoadTaskResult.  

        success = email.loadTaskResult(task: task)
        task = nil

        if !success {
            print("\(email.lastErrorText!)")
            return
        }
        else {
            print("\(email.from!): \(email.subject!)\n")
        }

    }


}