2015-10-16 18 views
8

Bazen (nadiren gerçekleşir) Model nesneyi bir özellikle veya AFnetworking Bloğu içinde değiştirmeye çalışırken, Object has been deleted or invalidated. numaralı hatayı aldım. Herkes yanlış yaptığımı bulmama yardım edebilir mi?Hata: Nesne silinmiş veya geçersiz kılınmıştır. (Realm)


Hata - Durum 1:

Kodu:

- (void)myFunction { 
    Model *model = [Model objectForPrimaryKey:1]; 

    if (model) { 
     [self updateModel:model]; 
    } 
} 

- (void)updateModel:(Model *)model { 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    [manager PUT:@"http://www.example.com" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 

     [[RLMRealm defaultRealm] beginWriteTransaction]; 
     model.updated = YES; // Crash: Object has been deleted or invalidated. 
     [[RLMRealm defaultRealm] commitWriteTransaction]; 

    } failure:nil]; 
} 

Hata - Durum 2:

Mülkiyet:

@property (strong, nonatomic) Model *model; 

Kodu:

- (void)myFunction { 
    Model *model = [Model objectForPrimaryKey:1]; 

    if (model) { 
     self.model = model; 

     UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Would you like to edit the model?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil]; 
     [alert show]; 
    } 
} 

UIAlertView Delegesi:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     [[RLMRealm defaultRealm] beginWriteTransaction]; 
     self.model.updated = YES; // Crash: Object has been deleted or invalidated. 
     [[RLMRealm defaultRealm] commitWriteTransaction]; 
    } 
} 

teşekkürler.

cevap

7

Örnek 1'de olduğu gibi, ağ isteği farklı bir işlem sırasına göre eşzamansız olarak yürütülür ve ana iş parçacığına geri çağrılır. Bu, büyük olasılıkla bir kullanıcı eylemi tarafından tetiklenebilen bazı kodun yerinde olması olasılığından dolayıdır. eşzamanlı olarak nesne. Tuttuğunuz model nesne referansı otomatik olarak güncellenir ve silme işlemini yansıtır. Silinen bir nesne değiştirilemediği için hataya gelir.

Ayrıca örnek 2, eşzamanlılığı içerir. Kodunuz önce model nesneyi alır, ardından uyarı görünümünü gösterir. UIAlertView gösterilirken, ana konu engellenmez. Aynı zamanda teorik olarak, daha önce deşifre edilen bir ağ işlemi tamamlanabildiğinde, tamamlama bloğu gönderilebilir, model nesnesinin bir silinmesi gerçekleşir. Kullanıcı değişiklikleri onaylar. Temsilci uygulamanız çağrılır, ancak daha önce alınan nesnenin hala var olmasını bekler.

Çarpışmalardan sakınmak için bir olasılık, tam bir model nesne başvurusu yerine yalnızca bir birincil anahtarı depolamaktır; bu, güncel değişiklikleri güncelleştirmeyi ve yansıtmayı sürdürür. Birincil anahtar sabit kalacaktır ve daima nesneyi tanımlayabilmelidir. Daha sonra nesneyi doğrudan yazım işleminize almak için birincil anahtarı kullanabilirsiniz.

Verileriniz eşzamanlı olarak değiştirildiyse, uygulamanızın nasıl davranacağını tanımlamanız sizin için her durumda olacağına dikkat edin. Nesneyi yeniden kopyalamaya daha fazla veriyi saklayarak yeniden oluşturabilir veya olayı göz ardı edebilir ve silme işlemini kazanabilirsiniz ya da kullanıcı arayüzünü yeterince kısıtlayarak çelişen değişiklikler olmayacağından emin olabilirsiniz. Bir çatışma çözüm stratejisi bulmalısın.

+0

Model Model göndermek yerine Model birincil anahtarını göndermek için değiştirdim ve her defasında daha önce bulmaya çalışıyorum. Crash gitti ve düzgün çalışıyor, teşekkürler! –

İlgili konular