Swift
Swift
Async Progress Info Log
See more Async Examples
Demonstrates checking for progress info updates when running a task asynchronously.Chilkat Swift Downloads
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
// The mailman object is used for sending and receiving email.
let mailman = CkoMailMan()!
// Set the SMTP server and any required settings.
mailman.smtpHost = "smtp.mymailserver.com"
mailman.smtpUsername = "myLogin"
mailman.smtpPassword = "myPassword"
mailman.startTLS = true
// Create a new email object
let email = CkoEmail()!
email.subject = "This is a test"
email.body = "This is a test"
email.from = "Chilkat Support <support@chilkatsoft.com>"
success = email.add(to: "Chilkat Admin", emailAddress: "admin@chilkatsoft.com")
// Call the async version of the SendEmail method to return a task object.
// The task object is loaded, but is in the Inert state -- meaning it is
// not yet scheduled to run on Chilkat's background thread pool.
var task: CkoTask? = mailman.sendEmailAsync(email: email)
if mailman.lastMethodSuccess == false {
print("\(mailman.lastErrorText!)")
return
}
// Before starting the task, tell it to keep an in-memory log of what would've been
// ProgressInfo event callbacks.
task.keepProgressLog = true
// Schedule the task for running on the thread pool. This changes the task's state
// from Inert to Live.
success = task!.run()
if success != true {
print("\(task!.lastErrorText!)")
task = nil
return
}
// The application is now free to do anything else
// while the email is being sent.
// For this example, we'll simply sleep and periodically
// check to see if the SendEmail if finished. While checking
// however, we'll report on the progress.
var curPctDone: Int = 0
var name: String?
var value: String?
while task!.finished != true {
if task!.percentDone.intValue != curPctDone {
curPctDone = task!.percentDone.intValue
print("\(curPctDone) percent done")
}
// Check the progress info log.
// Emit any log entries..
while (task!.progressLogSize.intValue > 0) {
// Get the 1st entry, emit it, and then remove it..
name = task!.progressInfoName(index: 0)
value = task!.progressInfoValue(index: 0)
print("\(name!): \(value!)")
task!.removeProgressInfo(index: 0)
}
// Sleep 100 ms.
task!.sleepMs(numMs: 100)
}
// Just in case there are any remaining entries...
while (task!.progressLogSize.intValue > 0) {
// Get the 1st entry, emit it, and then remove it..
name = task!.progressInfoName(index: 0)
value = task!.progressInfoValue(index: 0)
print("\(name!): \(value!)")
task!.removeProgressInfo(index: 0)
}
// A finished task could be one that was canceled, aborted, or truly finished.
// If the task was "canceled", it was canceled prior to actually starting. This could
// happen if the task was canceled while waiting in a thread pool queue to be scheduled by Chilkat's
// background thread pool scheduler.
// If the task was "aborted", it indicates that it was canceled while running in a background thread.
// The ResultErrorText will likely indicate that the task was aborted.
// If the task "completed", then it ran to completion, but the actual success/failure of the method
// is determined by the result obtained via a GetResult* method. (A "completed" task will
// have a StatusInt equal to 7. If the task finished, but was not completed, then it must've
// been aborted or canceled:
if task!.statusInt.intValue != 7 {
print("Task did not complete.")
print("task status: \(task!.status!)")
task = nil
return
}
// The SendEmail method returns a boolean. Therefore, after the task is finished,
// we can get the boolean result by calling GetResultBool. This is the return value had
// we called SendEmail synchronously.
success = task!.getResultBool()
if success != true {
// The task's ResultErrorText contains what would have been in the LastErrorText property had
// the SendEmail method been called synchronously.
print("\(task!.resultErrorText!)")
}
else {
print("Email sent asynchronously.")
}
task = nil
success = mailman.closeSmtpConnection()
if success != true {
print("Connection to SMTP server not closed cleanly.")
}
}