Trouble updating UI Asynchronously

I’ve been wrestling with how to update my UI asynchronously by hitting my backend.

My question is, what is the design pattern to properly accomplish dynamically updated the UI asynchronously?

I have a UIManager gameobject with the follow code:

public Sprite penguinSprite;
public Sprite bearSprite;
public Sprite eagleSprite;

public GameObject sliderPanel;
public GameObject creatureBoxPrefab;

// Update is called once per frame
void Update ()
{
	if (Input.GetKeyDown (KeyCode.Space)) {
		StartCoroutine (UpdateSliderUI ());
	}
}

IEnumerator UpdateSliderUI ()
{
	// Hit the DB to get UI Objects to load
	var query = ParseObject.GetQuery ("Creatures");
	query.FindAsync ().ContinueWith (t => {
		Debug.Log ("Found Results!");
		IEnumerable<ParseObject> results = t.Result;

		//each result (r) will populate a new UI prefab
		foreach (var r in results) {
			string sn = r.Get<string> ("spriteName");
			Sprite s;

			switch (sn) {
			case "penguinSprite":
				s = penguinSprite;
				break;
			case "bearSprite":
				s = bearSprite;
				break;
			case "eagleSprite":
				s = eagleSprite;
				break;
			default:
				s = penguinSprite;
				break;
			}

			// creatureBox is the UI prefab, it has child "CreatureImage"
			GameObject creatureBox = Instantiate (creatureBoxPrefab) as GameObject;

			// set the sprite texture
			GameObject ci = creatureBox.transform.FindChild ("CreatureImage").gameObject;
			Image cii = ci.GetComponent<Image> ();
			cii.sprite = s;

			// set the number of animals remaining
			GameObject ct = creatureBox.transform.FindChild ("CreaturesRemainingText").gameObject;
			Text ctt = ct.GetComponent<Text> ();
			ctt.text = string.Format ("{} creatures left", r.Get<int> ("numAlive"));

			creatureBox.transform.parent = sliderPanel.transform;
		}
	});
	yield return null;
}

I’m getting the following error:

Internal_CloneSingle can only be
called from the main thread.
Constructors and field initializers
will be executed from the loading
thread when loading a scene. Don’t use
this function in the constructor or
field initializers, instead move
initialization code to the Awake or
Start function.

You can’t access any Unity objects asynchronously.

You can do the following

IEnumerator UpdateSliderUI () {
    var query = ParseObject.GetQuery ("Creatures");
    Task task = query.FindAsync ();
    while(!task.IsCompleted) yield return null;
    // Do all your continue with stuff here
}

In this code Unity will check the Task every frame until it is completed. Then it will continue with the coroutine in the main thread.