2015-08-26 8 views
11

Zastanawiam się co jest najlepsze praktyki dla instancji bazy danych królestwa jest dla Swift 2. Jedną z głównych różnic między Realm Swift Swift 1.2 i 2 jest to, że klasa Realm dodała wsparcie dla obsługi błędów. Dlatego ten kod na stronie Realm już nie działa:Tworzenie bazy danych Realmating dla Swift 2.0 - najlepsza praktyka?

let realm = Realm()

mogę myśleć kilka sposobów wystąpienia klasy Realm świata Swift 2:

(1) dajmy królestwo = spróbuj! Realm()

Ta opcja wydaje się trochę „niebezpieczne” dla mnie jako potencjalnie skutkuje błędem wykonania jeśli klasa nie instancję.

(2) Operacja Place cały Realm (w tym klasy instancji) wewnątrz bloku Do przyłów

do { 
    let realm = try Realm() 

    realm.write{realm.add(myObject)} 
    } 
    catch 
    { 
     print("Some Realm error") 
    } 

To na pewno działa i jest na pewno bezpieczne. Jednak ja nie lubię konieczności wystąpienia the Realm klasa każdym razem, gdy trzeba wykonać operację na bazie danych. Gdy próbuję tworzyć wykonania Ivar „królestwo” i umieścić go na zewnątrz bloku Do przyłów, zmienna wykracza poza zakres. Na przykład, poniższy kod nie będzie kompilować ...

//IVAR declared outside of Do-Catch... 
    let realm:Realm 

    do{ 
     //Get instance of Realm 
     realm = try Realm() 

     //This write operation works 
     realm.write{realm.add(myObject_1)} 
    } 
    catch 
    { 
     print("Some Realm error") 
    } 


    //Create another Dog object 
    let myObject_2 = SomeObject() 

    //This next line produces an error: "Variable 'realm' used before being initialized". 
    //Initialized 'realm' inside Do-Catch is now out of scope. 
    realm.write({ 
     realm.add(myObject_2) 
    }) 

będę wdzięczny za wszelkie opinie (zwłaszcza ktoś z Realm) na co najlepsze praktyki dla pracy z Krain w nowym obsługi błędów środowiska z Swift 2 powinien wyglądać. Z góry dziękuję.

Odpowiedz

7

Jeśli nie masz zamiaru obsługiwać otrzymywanych błędów, I wysoce zalecam używanie try!.

Drugi fragment kodu nie działa, ponieważ jeśli inicjalizacja Rejestru nie powiedzie się, ta zmienna realm nigdy nie jest przypisana, co jest nieprawidłowe. prawdopodobnie można obejść, że poprzez zmienna realm być typu Realm?.

+0

Bardzo dziękuję – luckman777

+1

spróbuj! robi lewę, ale zgadzam się z @ luckman777, nie czuję się bezpiecznie i może to spowodować awarię aplikacji. jeśli się zawiesza, może to być spowodowane brakiem pliku lub błędem migracji, który prawdopodobnie powinien być obsługiwany w znacznie większym zakresie globalnym, może na appLaunch ... spróbować? z drugiej strony może zwrócić wartość opcjonalną i pominąć scenariusz obsługi błędów. Nie jestem pewien, co jest lepsze, w tej chwili zmieniłem większość instancji, by spróbować! ... i mam nadzieję na najlepsze? –

1

Należy pamiętać, że zarówno Realm() i napisać można wyrzucić. Oznacza to, że obaj muszą spróbować catch, chyba że użyjesz try !. Na przykład:

do { 
     let realm = try Realm() 

     do { 
      try realm.write { 
       realm.add(myObject_1) 
      } 
     } catch let error { 
      print(error) 
     } 

    } catch let error{ 

     print(error) 
    } 
Powiązane problemy