Almacenamiento e iterando sobre múltiples punteros NSERROR -- bjective-c campo con error-handling campo con cocoa camp codereview Relacionados El problema

Storing and iterating over multiple NSError pointers


3
vote

problema

Español

¿Cómo te reforzarías este tipo de código? He probado sin éxito varios enfoques (NSARRAY, NSPOINTERRAY, ARRAY PLANTE C), pero siempre se ejecutó en el error de cheques de tipo puntero.

  NSError *error1; NSError *error2; NSError *error3; //imagine MANY of them [object1 methodWithError: &error1]; [object2 methodWithError: &error2]; [object3 methodWithError: &error3]; BOOL wasErrorOfCode1 = ([error1 code] == 1) || ([error2 code] == 1) || ([error3 code] == 1); if (wasErrorOfCode1) { //do stuff   
Original en ingles

How would you refactor this kind of code? I've unsuccessfully tried several approaches (NSArray, NSPointerArray, plain C array), but always ran into pointer type checking error.

NSError *error1; NSError *error2; NSError *error3; //imagine MANY of them [object1 methodWithError: &error1]; [object2 methodWithError: &error2]; [object3 methodWithError: &error3]; BOOL wasErrorOfCode1 = ([error1 code] == 1) || ([error2 code] == 1) || ([error3 code] == 1); if (wasErrorOfCode1) { //do stuff 
        
     
     

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Quiero proponer un código de diferente estructura, que especialmente será más fácil de adaptarse para obtener más objetos.

  NSArray *objects = @[object1, object2, object3]; NSMutableArray *errors = [NSMutableArray array];  [objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {     NSError *error;     [obj methodWithError: &error];     if(error){         [errors addObject: @{@"error":error,@"object":obj}];     } }];   

Ahora puede iterar todos los errores y examinarlos junto con el objeto en el que se produjo el error.

  [errors enumerateObjectsUsingBlock:^(NSDictionary *errorDict, NSUInteger idx, BOOL *stop) {     NSError *error = errorDict[@"error"];     id object = errorDict[@"object"];     if(…){         //add an appropriate test     } }];   

No puede agregar los errores a una matriz por adelantado, ya que

  NSError *error1;   

se dará como resultado en un objeto NIL para la variable error1 . Las matrices NS (mutables) no pueden manejar los objetos NIL. Lo mismo para los diccionarios.
Por otro lado, mi solución permite agregar los errores, ya que solo los agrega una vez que se asigna a los objetos existentes a la variable error .

 

I want to propose a differently structured code, that especially will be easier to adapt for more objects.

NSArray *objects = @[object1, object2, object3]; NSMutableArray *errors = [NSMutableArray array];  [objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {     NSError *error;     [obj methodWithError: &error];     if(error){         [errors addObject: @{@"error":error,@"object":obj}];     } }]; 

Now you can iterate over all errors and examine them along with the object the error occurred on.

[errors enumerateObjectsUsingBlock:^(NSDictionary *errorDict, NSUInteger idx, BOOL *stop) {     NSError *error = errorDict[@"error"];     id object = errorDict[@"object"];     if(xe2x80xa6){         //add an appropriate test     } }]; 

you can't add the errors into an array upfront, as

NSError *error1; 

will result into a nil-object for the variable error1. NS(Mutable)Arrays can't handle nil objects. Same for dictionaries.
On the other hand my solution allows adding the errors, as it only add them once an existing objects is assigned to the variable error.

 
 
 
 
0
 
vote

Encontré una solución utilizando la matriz llada C y __autoreleasing

  int number = 3; NSError __autoreleasing *errors[number]; //without __autoreleasing, compiler (with ARC) will complain //imagine MANY of them [object1 methodWithError: &errors[0]]; [object2 methodWithError: &errors[1]]; [object3 methodWithError: &errors[2]]; BOOL wasErrorOfCode1 = NO; for (int i = 0; i < number; ++i) {     wasErrorOfCode1 &= ([errors[i] code] == 1); } if (wasErrorOfCode1) { //do stuff   
 

I found a solution using plain C array and __autoreleasing

int number = 3; NSError __autoreleasing *errors[number]; //without __autoreleasing, compiler (with ARC) will complain //imagine MANY of them [object1 methodWithError: &errors[0]]; [object2 methodWithError: &errors[1]]; [object3 methodWithError: &errors[2]]; BOOL wasErrorOfCode1 = NO; for (int i = 0; i < number; ++i) {     wasErrorOfCode1 &= ([errors[i] code] == 1); } if (wasErrorOfCode1) { //do stuff 
 
 

Relacionados problema

2  Reproducción de un sonido dependiendo de la imagen de la tarjeta Flash que se muestra actualmente  ( Playing a sound depending on the currently displayed flash card image ) 
He desarrollado una aplicación de tarjeta Flash de trabajo completamente para niños. Tiene un 99887776655443388 que ciclos a través de 26 cartas (ABC) a tra...

4  ¿Existe una mejor manera de asegurarse de que se inicialice una variable al usar bloques?  ( Is there a better way to make sure a variable is initialized when using blocks ) 
Tengo un método para proporcionar un 99887766655443340 usando dailyatt1 . Necesito asegurarme de que el dailyatt2 se inició antes de regresar, así que ag...

5  Presentando diálogos modales de XIB en Cocoa: ¿El mejor / patrón más corto?  ( Presenting modal dialogs from xib in cocoa best shortest pattern ) 
A continuación se muestra mi módulo Típico deControlador de ventanas para presentar un cuadro de diálogo modal (podría ser la configuración, solicitando nombr...

3  Aplicando la falta de definición gaussiana a UILABEL  ( Applying gaussian blur to uilabel ) 
Aquí está el código y es realmente lento, como segundos lentos para representar aproximadamente 25 etiquetas. <?php $connection = mysqli_connect( "loca...

3  ¿Cómo podría mejorarse este código de constructor?  ( How could this constructor code be improved ) 
¿Cómo podría mejorarse este código de constructor? Siento que no estoy haciendo algo de manera óptima aquí ... @interface JGProduct : NSObject { NSStri...

1  Configuración del camino a la barra de herramientasSociadaxIname, con retraso  ( Setting the path to toolbarassociatedxibname with fallback ) 
Tengo algún código que he incluido en un proyecto que quiero liberar. Aquí hay uno de esos bloques: NSString *path = nil; if (delegate && [delegate respond...

5  OpenGL juego Editar vista  ( Opengl game edit view ) 
Estoy trabajando en un proyecto de cacao que usa OpenGL. Estoy tratando de mantener las cosas fácilmente cruzables para más tarde (que es la razón principal p...

4  Inicializando una ventana en cacao  ( Initializing a window in cocoa ) 
Este es alguno del código que tengo: (ns mdclj.spans (:use [mdclj.misc])) (def ^:private formatter [["`" ::inlinecode] ["**" ::strong] ["__" :...

3  Visualización de los datos de JSON de un servidor en una UicollectView  ( Displaying json data from a server in a uicollectionview ) 
Este código tira de JSON desde un servidor y ofrece algunos datos como #!/bin/bash # Example of using functions mygetopts and isoption to provide easy # acce...

1  Swift Lazy observa y muta patrón para matrices  ( Swift lazy observe and mutate pattern for arrays ) 
Estoy usando el siguiente patrón en mi código. Funciona. ¡Pero, se siente como si estuviera al borde de lo que debería funcionar! ¿Debo considerar una alter...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos