お時間をいただきありがとうございます。SwiftでAWSTaskオブジェクトを使用する適切な方法は何ですか?
私のコードでは、AWSSQSに対して、AWSTaskを返すさまざまな要求を行っています。これらのAWSTaskオブジェクトを操作することは非常に困難であると同時に、AWS固有のすべてのロジックを単一のクラスに保ちながら、必要に応じて別のクラウドサービスに簡単に切り替えることができます。
私がやりたいことは、一連のAWSタスクを非同期的に連続的に実行することです。通常、カスタムのシリアルディスパッチキューにタスクを追加するだけですが、AWSTaskオブジェクト自体は非同期タスクなので、できません。
ここには、私が抱えている問題を示す簡単な例があります。それは実際の世界の目的を持っていませんが、問題を説明する良い仕事をしています。以下では、SQSキューを作成し、SQSキューにメッセージを送信し、SQSキューからメッセージを受信し、SQSキューを削除するコードを用意しています。私はこれらの4つのことをシリアル非同期方式でやりたいとしましょう。言い換えれば、次のタスクを試みる前に前のタスクが成功したことを確認したいと思います。
のViewController
DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {
awsClass.runTest()
DispatchQueue.main.async {
print("Test Finished")
}
}
AwsClass
public func createQueue(){
guard let createQueueRequest = AWSSQSCreateQueueRequest() else{fatalError()}
createQueueRequest.queueName = "TestQueue"
sqs.createQueue(createQueueRequest).continueWith(block: {(task) -> AnyObject? in
if task.error != nil {
print(task.error!)
}
else if task.result != nil {
self.queueUrl = task.result!.queueUrl!
print("created queue at: \(self.queueUrl!)")
}
return nil
})
}
public func deleteQueue(){
if queueUrl != nil {
guard let deleteQueueRequest = AWSSQSDeleteQueueRequest() else{fatalError()}
deleteQueueRequest.queueUrl = queueUrl
sqs.deleteQueue(deleteQueueRequest).continueWith(block: {(task) -> AnyObject? in
if task.error != nil {
print(task.error!)
}
else if task.result != nil {
print("queue sucessfully deleted from \(self.queueUrl!)")
self.queueUrl = nil
}
return nil
})
}
else{
print("Queue has already been deleted")
}
}
public func sendMessage(messageData: String, toConnectId: String) {
guard let sendMessageRequest = AWSSQSSendMessageRequest() else{fatalError()}
sendMessageRequest.queueUrl = toConnectId
sendMessageRequest.delaySeconds = 0
sendMessageRequest.messageBody = messageData
sqs.sendMessage(sendMessageRequest).continueWith(block: {(task) -> AnyObject? in
if task.error != nil {
print(task.error!)
}
else if task.result != nil {
print("successfully sent message to \(toConnectId)")
}
return nil
})
}
public func receiveMessage(){
guard let receiveMessageRequest = AWSSQSReceiveMessageRequest() else{fatalError()}
receiveMessageRequest.queueUrl = self.queueUrl
receiveMessageRequest.maxNumberOfMessages = 1
sqs.receiveMessage(receiveMessageRequest).continueWith(block: {(task) -> AnyObject? in
if task.error != nil {
print(task.error!)
}
else if task.result != nil {
let message = (task.result?.messages?.first)!
print("successfully received message with body: \(message.body ?? "failed")")
}
return nil
})
}
public func runTest(){
let mySerialQueue = DispatchQueue(label: "mySerialQueue")
mySerialQueue.sync {
self.createQueue()
}
mySerialQueue.sync {
self.sendMessage(messageData: "test", toConnectId: "https://someUrl")
}
mySerialQueue.sync {
self.receiveMessage()
}
mySerialQueue.sync {
self.deleteQueue()
}
}
AWSTasksは補完関数と非同期であるので、コードはすぐにすべての4つの呼び出しを行い、これらのタスクが完了したときに、その後の補完関数が呼び出されます。代わりに、次のタスクが始まる前に、最初のタスクの完了機能を終了します。