Error Handling Στόχος C κατά τη διάρκεια καμία απάντηση

ψήφοι
0

Σε εφαρμογή μου χρησιμοποιώ ακόλουθες μεθόδους για να POST / GET δεδομένα από έναν απομακρυσμένο server.

     postData = [self sendSynchronousRequest:request returningResponse:&response error:&error];

    - (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
{

    NSError __block *err = NULL;
    NSData __block *data;
    BOOL __block reqProcessed = false;
    NSURLResponse __block *resp;

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable _data, NSURLResponse * _Nullable _response, NSError * _Nullable _error) {
        resp = _response;
        err = _error;
        data = _data;
        reqProcessed = true;
    }] resume];

    while (!reqProcessed) {
        [NSThread sleepForTimeInterval:0];
    }

*response = resp;
*error = err;
return data;

}

Έχω βασικό χειρισμό σφαλμάτων χωρίς σύνδεση δικτύου και εφαρμογών κατευθύνει τους χρήστες σε καμία συνδεσιμότητα δικτύου viewController. Αλλά θα ήθελα να λογοδοτήσουν για τις καταστάσεις, όταν για παράδειγμα server είναι κάτω ή μορφή των δεδομένων της api έχει αλλάξει, Απλά αναρωτιέμαι πώς θα εντοπιστούν αυτά τα λάθη και να αποτρέψει την εφαρμογή από τη συντριβή.

Δημοσιεύθηκε 20/10/2018 στις 12:55
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Ένα ζευγάρι των γενικών σημεία:

  • Μην κάνετε αιτήματα συγχρόνως. Περάστε σε ένα μπλοκ με τον κωδικό που πρέπει να εκτελεστεί όταν η αίτηση συμπληρώνει. Δεν υπάρχει κανένας λόγος να δένουν μια κλωστή περιμένουν για ένα χειριστή ολοκλήρωσης για να τρέξει, και αυτό είναι ακόμα χειρότερο αν αυτό το νήμα είναι ουσιαστικά λειτουργεί συνεχώς με τα δικά σας είναι.
  • Αν πρέπει οπωσδήποτε να το κάνετε αυτό (γιατί;), τουλάχιστον χρησιμοποιήστε ένα σηματοφόρο και να περιμένουν στην σηματοφόρο. Με αυτόν τον τρόπο, δεν είστε καίγοντας ένα core CPU συνεχώς ενώ περιμένετε.

Ο τρόπος που μπορείτε να αποφύγετε συντρίβεται είναι η λογική ελέγχει τα δεδομένα που παίρνετε πίσω, π.χ.

  • Ελέγξτε το μήκος των δεδομένων και βεβαιωθείτε ότι δεν έχετε να πάρετε τα δεδομένα μηδέν / κενή απάντηση.
  • Υποθέτοντας ότι ο διακομιστής στέλνει μια απάντηση JSON, τυλίξτε NSJSONSerialization parsing σας σε ένα μπλοκ @try, και αν αποτύχει ή να ρίχνει μια εξαίρεση, να χειριστεί το σφάλμα σε κάποιο χρήσιμο τρόπο.
  • Γενικά υποθέσουμε ότι όλα τα δεδομένα είναι άκυρη μέχρι αποδείξεως του εναντίου. Ελέγξτε για να βεβαιωθείτε ότι τα δεδομένα νόημα.
  • Αν είστε υπεύθυνος για την πλευρά του διακομιστή, να εξετάσει περνώντας μια έκδοση API ως επιχείρημα, και όπως μπορείτε να τροποποιήσετε τα πράγματα στο μέλλον, βεβαιωθείτε ότι δεν συμβιβάζεται αλλαγές συμβαίνουν μόνο όταν ανταποκρίνονται σε πελάτες που ζητούν μια νεότερη έκδοση του API (ή, εναλλακτικά, , να στείλετε μια απάντηση που λέει ο πελάτης ότι πρέπει να αναβαθμιστεί, και στη συνέχεια να αρνηθεί την παροχή των δεδομένων).
Απαντήθηκε 22/10/2018 στις 02:13
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more