About the snapshots, they come for the various items in the table independently of one another, just like the real-time updates
and there is no notification that all of them have been received.

You could determine that by knowing how many items are in the table,
but, unfortunately, the information on the number of items is indeed lacking for the SimpleTableInfo case.
Do you confirm that in your case the client, at the time of subscription, doesn't know how many items are involved?

To workaround the limitation, your Metadata Adapter, when resolving the group ID in getItems, could add a "sentinel" item as the last element of the returned array.
The sentinel item would just associate a recognizable value to a specific field, so that the client, upon reception of the snapshots, could recognize that value and take the index of the related item as the last one (still, it would be possible that the shapshot for some of the previous items would be yet to come).