Hola!Estoy convirtiendo parte de mi código a programación rx. La verdad es que el núcleo duro. Os dejo un ejemplo de como he pasado de esto:
public virtual IEnumerator webService(eAction action) {
cDebug.trace(this.debugLocal, this.name, "webService", "Begin");
// Includes http://
WWW www = new WWW(this.parameters.url + this.parameters.query);
cDebug.trace(cDebug.isDebug, this.name, "webService", www.url);
cDebug.redirect(this.txtDebugBig);
this.parameters.elapsedTime = 0.0f;
this.parameters.bError = false;
this.parameters.strError = "";
this.parameters.checksum = "";
while (!www.isDone) {
this.parameters.elapsedTime += Time.deltaTime;
if (this.parameters.elapsedTime >= this.parameters.timeOut) {
this.parameters.bError = true;
this.parameters.strError = "Timeout";
this.parameters.user.status = eStatus.timeOut;
break;
}
yield return null;
}
if (this.parameters.bError == false) {
if (!www.isDone || !string.IsNullOrEmpty(www.error)) {
this.onError(www.text, www.error);
} else {
cDebug.trace(this.debugLocal, this.name, "webService", "www.text = " + www.text);
cDebug.redirect(this.txtDebugBig);
// String can be null and no error
if (!string.IsNullOrEmpty(www.text)) {
// OK
this.sizeDownload(www.responseHeaders.Where(item => item.Key == "CONTENT-LENGTH").FirstOrDefault().Value, www.bytesDownloaded);
if (www.text.Contains("<!--") == true) {
int pos = www.text.IndexOf("<!--");
this.parameters.jsonResults = www.text.Substring(0, pos);
} else {
this.parameters.jsonResults = www.text;
}
this.onOK(action, this.parameters.jsonResults);
} else {
this.onError(null, "webService - www.text void");
}
}
}
cDebug.trace(this.debugLocal, this.name, "webService", "End");
}
A este código con rx:
public IEnumerator rxWebService(eAction action, string url) {
cDebug.trace(cDebug.isDebug, this.name, "rxWebService", "Begin");
IObservable<WWW> rx = ObservableWWW.GetWWW(url)
.Select(www => {
cDebug.trace(cDebug.isDebug, this.name, "rxWebService", www.url);
cDebug.redirect(this.txtDebugBig);
this.parameters.jsonResults = www.text;
this.sizeDownload(www.responseHeaders.Where(item => item.Key == "CONTENT-LENGTH").FirstOrDefault().Value, www.bytesDownloaded);
this.onOK(action, this.parameters.jsonResults);
return (www);
})
.Timeout(System.TimeSpan.FromSeconds(this.parameters.timeOut))
.CatchIgnore((WWWErrorException ex) => {
this.onError("rxWebService", ex.RawErrorMessage);
})
.OnErrorRetry((System.Exception ex) => UnityEngine.Debug.LogException(ex), retryCount: 3, delay: System.TimeSpan.FromSeconds(1))
;
cDebug.trace(cDebug.isDebug, this.name, "rxWebService", "End");
return (rx.ToYieldInstruction());
}
Tengo que convertirlo a yields, para irlo integrando. A medida que la conversión "suba para arriba" los iré eliminando.Qué os parece?
disculpa mi ignorancia , para que sirve o que?
Por lo poco que pude entender del otro hilo que subió, es para hacer operaciones en paralelo, en otro hilo, ahí lo implementa en la descarga de un archivo.Pero iRobb, en qué se nota la diferencia? Mas eficiencia? Se nota diferencia en usar las típicas corrutinas y esta librería? Menos tiempo no creo que sea, porque eso depende de la conexión, no? Cuánto me falta por aprender!! ( ._.)
Hay muchos factores que lo diferencian:- El código es mucho más limpio. P.ej. se eliminan esos while a la espera de www, el control de errores está normalizado, así como el timeout, el retry, y más que hay.- Esto solamente lanza una acción, pero se pueden lanzar n acciones en paralelo que van en THREADS reales, no en el mismo thread como las coroutines, así que eficiencia seguro. Se utiliza SelectMany en vez de Select para ello.- El workflow (flujo) del código es más evidente. Cada Select/SelectMany realiza una o un grupo de acciones dependientes de la anterior. P.ej. se puede poner .Select(...) .Select(valor devuelto anterior) .Select (del anterior) etc.Saludos!
Es lo que dice iRobb. A simple vista ya solo el codigo es bastante más limpio. Imaginate cuando tienes miles de lineas de codigo!!. Por otro lado la parte que mas me atrae del codigo con rx es el tema de que se pueda utilizar miltithread de verdad.Yo ahora ando liado con un proyecto que mostraré en breve por aquí, pero en cuanto me lo presente tengo intención de meterme con el rx para aprender a manejarlo. De nuevo hay que darle las gracias a iRobb por encontrar esto. Yo ni sabia que existia.. jajaSaludos
aaaaaaaaaaaa misa ya entender, coool nah estoy medio lelo, a lo que entiendo que con esto puedes manejar y crear hilos de corountine por separado y administrarlas, eso esta muy interesante la verdad, seria bueno que despues nos des una catedra para super noobs como yo, para aprovechar este tipo de implementaciones jeje saludos
[quote author=ACarranza date=1455565313" data-ipsquote="" data-cite="ACarranza" class="ipsQuote">aaaaaaaaaaaa misa ya entender, coool nah estoy medio lelo, a lo que entiendo que con esto puedes manejar y crear hilos de corountine por separado y administrarlas, eso esta muy interesante la verdad, seria bueno que despues nos des una catedra para super noobs como yo, para aprovechar este tipo de implementaciones jeje saludos
Sólo texto |
Texto con Imágenes