如何防止添加到List的类的实例在IEnumerator方法中被销毁?

时间:2016-02-26 19:43:29

标签: c# list unity3d coroutine ienumerator

如果你能帮助我解决这个问题,我将非常感激。

OpponentItem类的字段应该填充来自collectItems的数据。

我们的对手的项目将列在opponentList中,其数据来自incomingData。由于我不知道StartCoroutine何时结束collectData方法设置progressBar和Update检查opponentList的元素。

不幸的是,在方法中实例化的OpponentItem对象已经消失,因此list为空。

angular.js:13236 Error: [ng:areq] Argument 'fn' is not a function, got undefined
http://errors.angularjs.org/1.5.0/ng/areq?p0=fn&p1=not%20aNaNunction%2C%20got%20undefined
at http://localhost:3000/bower_components/angular/angular.js:68:12
at assertArg (http://localhost:3000/bower_components/angular/angular.js:1825:11)
at assertArgFn (http://localhost:3000/bower_components/angular/angular.js:1835:3)
at Promise.promise.error    (http://localhost:3000/bower_components/angular/angular.js:10979:11)
at Object.getUserChannels (http://localhost:3000/scripts/services/media-service.js:38:37)
at activate (http://localhost:3000/scripts/controllers/player-controller.js:63:22)
at new <anonymous> (http://localhost:3000/scripts/controllers/player-controller.js:28:9)

1 个答案:

答案 0 :(得分:1)

这是一个问题。您的列表将始终为空,因为默认情况下,参数按值传递(请参阅此MSDN链接)

opponentList = new List<OpponentItem>();        
StartCoroutine(collectData<OpponentItem>(opponentList, incomingData, collectItems));

分配list = new List<T>(tempArray.Length)后,您将项目添加到新的列表引用中,而不是传递给collectData()的项目。

您有两个选择:

1)清除列表而不是重新分配

 public IEnumerator collectData<T>(List<T> list, string[] tempArray, string[] queryArray) where T : new() {

    // list =  new List<T>(tempArray.Length); // ** problem
    list.Clear();  // ** try clearing the list instead

    for(int h = 0; h < tempArray.Length ; h++){

2)通过引用传递列表

 opponentList = new List<OpponentItem>();

 StartCoroutine(collectData<OpponentItem>(ref opponentList, incomingData, collectItems));

}

    public IEnumerator collectData<T>(ref List<T> list, string[] tempArray, string[] queryArray) where T : new() {

    list =  new List<T>(tempArray.Length);