Hello,
I have a simple app that collects data with one of those being a signature captured as an image. I have an issue when I go to submit the data and create the record, the attachment code endless loops and keeps adding the attachment.
My pseudo code looks like this:
1. Add Features to Feature Table
2. On Features Added, apply edits.
3. OnApplyEditsStatusChanged
4. OnSelectFeaturesStatusChanged, Add the attachment
Once the attachment is added, the onApplyEditsStatusChanged triggers causing a new selection which then in turn adds the attachment again and enters an infinite loop.
How do I not trigger the ApplyEdits after an attachment is added? or is there an entirely different way of approaching this problem?
Solved! Go to Solution.
Yeah, you will need to code it differently since your signal handlers are all triggering each other in an endless loop. There are probably many ways to do it. For example, do you need to apply edits right after you add the feature? Could you select features from within your addFeatures signal handler, then when feature is selected, add attachments and apply edits (in this case, applyEdits signal handler wouldn't retrigger a selection). You could also add some type of bool or state to indicate what part of the workflow the user is in, and take different code paths depending on that.
@Anonymous User ,
Are you using ArcGIS Runtime SDK for Qt inside AppStudio app, correct?
I think the Psuedo code looks good to me, can you share the actual code?
I am including @LucasDanzinger from ArcGIS Runtime SDK for Qt to see if there anything wrong with this.
Thank you,
Erwin
FeatureLayer{
id: featurelayer
onSelectFeaturesStatusChanged: {
if (selectFeaturesStatus === Enums.TaskStatusCompleted) {
if (!selectFeaturesResult.iterator.hasNext)
return;
selectedFeature = selectFeaturesResult.iterator.next();
selectedFeature.attachments.addAttachment(attachment, "image/jpeg", 'Official.jpg');
}
}
ServiceFeatureTable {
id:featureTable
url: serviceURL + "/0"
credential: portalCredential
QueryParameters{
id: params
}
onApplyEditsStatusChanged: {
if (applyEditsStatus === Enums.TaskStatusCompleted) {
params.objectIds = applyEditsResult[0]["objectId"]
featurelayer.selectFeaturesWithQuery(params, Enums.SelectionModeNew);
}
}
onAddFeaturesStatusChanged:{
if (addFeaturesStatus === Enums.TaskStatusCompleted) {
featureTable.applyEdits();
}
}
} //ServiceFeatureTable
}//FeatureLayer
Above is my feature layer. Yes, I am using the ArcGIS Runtime SDK using AppStudio. Below is the import statement I'm using.
import Esri.ArcGISRuntime 100.1
If you set autoApplyEdits to false on the feature's AttachmentListModel, it shouldn't apply automatically and you can control when it happens. https://developers.arcgis.com/qt/latest/qml/api-reference/qml-esri-arcgisruntime-attachmentlistmodel...
Setting autoApplyEdits to false does stop the infinite loop, but the attachments don't get added until I turn back to true which then starts the infinite loop again.
Yeah, you will need to code it differently since your signal handlers are all triggering each other in an endless loop. There are probably many ways to do it. For example, do you need to apply edits right after you add the feature? Could you select features from within your addFeatures signal handler, then when feature is selected, add attachments and apply edits (in this case, applyEdits signal handler wouldn't retrigger a selection). You could also add some type of bool or state to indicate what part of the workflow the user is in, and take different code paths depending on that.