EllanJiang/GameFramework · error · GameFrameworkException

Updatable version list has been parsed.

Error message

Updatable version list has been parsed.

What it means

OnLoadUpdatableVersionListSuccess guards against parsing the remote (updatable) version list twice: if m_UpdatableVersionListReady is already true when the load-success callback fires, it throws this GameFrameworkException. This protects the check pipeline from duplicate callbacks (e.g. CheckResources called twice while a load is still pending).

Solutions

  1. Guard your UI/logic so CheckResources is only called once per session (disable the button while updating).
  2. Track an isChecking flag and skip subsequent CheckResources calls until ResourceCheckComplete fires.
  3. Fix a custom ResourceHelper that fires the success callback more than once.

Example fix

// before
public void OnUpdateButtonClicked() { m_ResourceComponent.CheckResources(); } // can double-fire

// after
private bool m_Checking;
public void OnUpdateButtonClicked()
{
    if (m_Checking) return;
    m_Checking = true;
    m_ResourceComponent.CheckResources();
}
Defensive patterns

Strategy: type-guard

Validate before calling

private bool m_CheckInProgress;
void SafeCheck()
{
    if (m_CheckInProgress) return;
    m_CheckInProgress = true;
    m_ResourceComponent.ResourceCheckComplete += (…) => m_CheckInProgress = false;
    m_ResourceComponent.CheckResources();
}

Type guard

bool CanStartResourceCheck => !m_CheckInProgress;

Try / catch

try { m_ResourceComponent.CheckResources(); }
catch (GameFrameworkException ex) when (ex.Message.Contains("has been parsed"))
{
    Debug.LogWarning("Resource check already running; ignoring duplicate call.");
}

Prevention

When it happens

Trigger: Calling CheckResources twice in quick succession so the first parse completes (sets m_UpdatableVersionListReady=true) and a second LoadBytes callback for the same list arrives afterwards.

Common situations: UI double-click triggering resource update twice; two scripts both calling CheckResources on startup; a custom ResourceHelper that invokes both success callbacks or re-invokes the same one.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of EllanJiang/GameFramework@d0c010b051 (2026-09-15). Data as JSON: /api/errors/660d815d2e817f6f. Report an issue: GitHub.

Appendix: source

Thrown at GameFramework/Resource/ResourceManager.ResourceChecker.cs:259

                        m_ResourceManager.m_FileSystemManager.DestroyFileSystem(fileSystem.Value, true);
                        removedFileSystemNames.Add(fileSystem.Key);
                    }
                }

                if (removedFileSystemNames != null)
                {
                    foreach (string removedFileSystemName in removedFileSystemNames)
                    {
                        m_ResourceManager.m_ReadWriteFileSystems.Remove(removedFileSystemName);
                    }
                }
            }

            private void OnLoadUpdatableVersionListSuccess(string fileUri, byte[] bytes, float duration, object userData)
            {
                if (m_UpdatableVersionListReady)
                {
                    throw new GameFrameworkException("Updatable version list has been parsed.");
                }

                MemoryStream memoryStream = null;
                try
                {
                    memoryStream = new MemoryStream(bytes, false);
                    UpdatableVersionList versionList = m_ResourceManager.m_UpdatableVersionListSerializer.Deserialize(memoryStream);
                    if (!versionList.IsValid)
                    {
                        throw new GameFrameworkException("Deserialize updatable version list failure.");
                    }

                    UpdatableVersionList.Asset[] assets = versionList.GetAssets();
                    UpdatableVersionList.Resource[] resources = versionList.GetResources();
                    UpdatableVersionList.FileSystem[] fileSystems = versionList.GetFileSystems();
                    UpdatableVersionList.ResourceGroup[] resourceGroups = versionList.GetResourceGroups();
                    m_ResourceManager.m_ApplicableGameVersion = versionList.ApplicableGameVersion;
                    m_ResourceManager.m_InternalResourceVersion = versionList.InternalResourceVersion;

View on GitHub (pinned to d0c010b051)