2013-02-14 21 views
5

Aşağıdaki kod var: Aşağıdaki hata mesajları ileResim alma ile arka plan iş parçacığında devam eden MagicalRecords?

2013-02-13 18:55:47.404 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8386a90) → Saving <NSManagedObjectContext (0x8386a90): *** DEFAULT ***> on *** MAIN THREAD *** 
2013-02-13 18:55:47.404 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8386a90) → Save Parents? 1 
2013-02-13 18:55:47.404 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8386a90) → Save Synchronously? 0 
2013-02-13 18:55:47.497 Giordano.iPhone[13956:c07] Image fetched in saveItemFromJson for cid:7218 order_id:10 
2013-02-13 18:55:47.497 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8386a90) → Saving <NSManagedObjectContext (0x8386a90): *** DEFAULT ***> on *** MAIN THREAD *** 
2013-02-13 18:55:47.498 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8386a90) → Save Parents? 1 
2013-02-13 18:55:47.498 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8386a90) → Save Synchronously? 0 
2013-02-13 18:55:47.499 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x8386a90) Context DEFAULT is about to save. Obtaining permanent IDs for new 10 inserted objects 
2013-02-13 18:55:47.501 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8385aa0) → Saving <NSManagedObjectContext (0x8385aa0): *** BACKGROUND SAVING (ROOT) ***> on *** MAIN THREAD *** 
2013-02-13 18:55:47.502 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8385aa0) → Save Parents? 0 
2013-02-13 18:55:47.502 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8385aa0) → Save Synchronously? 1 
2013-02-13 18:55:47.502 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x8385aa0) Context BACKGROUND SAVING (ROOT) is about to save. Obtaining permanent IDs for new 10 inserted objects 
2013-02-13 18:55:47.505 Giordano.iPhone[13956:c07] __70-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke21(0x8385aa0) → Finished saving: <NSManagedObjectContext (0x8385aa0): *** BACKGROUND SAVING (ROOT) ***> on *** MAIN THREAD *** 
2013-02-13 18:55:47.505 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8385aa0) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING 

:

2013-02-13 18:55:47.511 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8385aa0) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING 
2013-02-13 18:55:47.512 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8385aa0) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING 
2013-02-13 18:55:47.512 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8385aa0) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING 
2013-02-13 18:55:47.512 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8385aa0) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING 
2013-02-13 18:55:47.513 Giordano.iPhone[13956:c07] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8385aa0) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING 


2013-02-13 18:55:47.515 Giordano.iPhone[13956:c07] Error: (null) 
2013-02-13 18:55:47.515 Giordano.iPhone[13956:c07] Error: (null) 
2013-02-13 18:55:47.515 Giordano.iPhone[13956:c07] Error: (null) 

ben kaçınarak am

dispatch_async(dispatch_get_main_queue(), ^{ 
    NSManagedObjectContext *localContext = [NSManagedObjectContext contextForCurrentThread]; 

    Item *newItem = [Item createInContext:localContext]; 
    newItem.title = NULL_TO_NIL([itemJson valueForKey:@"title"]); 
    newItem.image_url = NULL_TO_NIL([itemJson valueForKey:@"image_url"]); 
    newItem.order_id = @([[self largestOrderId] intValue] + 1); 

    NSURL *url = [NSURL URLWithString:newItem.image_url]; 
    NSData *data = [[NSData alloc] initWithContentsOfURL: url]; 
    if (data == nil) { 
     NSLog(@"Image data is nil from %@", url); 
    } else { 
     NSLog(@"Image fetched in saveItemFromJson for cid:%@ order_id:%@", newItem.cid, newItem.order_id); 
     newItem.image = [UIImage imageWithData:data]; 
    } 

    if (![localContext hasChanges]) { 
     NSLog(@"No local change detected. Quitting"); 
     return; 
    } 

    [localContext saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) { 
     if (!success) 
      NSLog(@"Error: %@", [error localizedDescription]); 
     else 
      NSLog(@"Item persisted for cid:%@ order_id:%@", newItem.cid, newItem.order_id); 
    }]; 
}); 

aşağıdaki bir sürü almak gibi görünmektedir Kullanımdan kaldırıldığı için saveInBackgroundWithBlock kullanın (dokümanların güncellenmesi gerekir?)

Kodumda sorun olan herhangi bir fikir var mı?

GÜNCELLEME

Takımım MagicalRecord şimdilik çok arabası olduğuna karar verdi. Kodumuzu MR'dan tekrar CoreData'ya taşıdık. İlginiz için teşekkürler.

+0

Asıl amacın nedir? –

cevap

0

MR_saveOnlySelfWithCompletion:'u denediniz mi?

2

Aynı sorunu yaşadım! Yalnızca, MR olmadan kendi elimle bağlamı kurtardığımda düzeltildi. Burada

benim çözümdür:

NSManagedObject + MyCategory.h

burada .m

+ (NSManagedObjectContext *)newMergableBackgroundThreadContext { 
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    context.parentContext = [self mainThreadContext]; 
    [context.userInfo setObject:[NSNumber numberWithInteger:VKCoreDataManagedObjectContextIDTempBackground] 
         forKey:@"contextID"]; 
    [context.userInfo setObject:kVKCoreDataManagedObjectContextBackgroundTemp 
         forKey:@"contextDebugName"]; 
    VKDLog(@"* New mergable backround context created! *"); 
    return context; 
} 

+ (void)saveDataInBackgroundWithBlock:(void (^)(NSManagedObjectContext *))saveBlock completion:(void (^)(void))completion { 
    NSManagedObjectContext *tempContext = [self newMergableBackgroundThreadContext]; 
    [tempContext performBlock:^{ 

     if (saveBlock) { 
      saveBlock(tempContext); 
     } 

     if ([tempContext hasChanges]) { 
      [tempContext saveWithCompletion:completion]; 
     } else { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (completion) { 
        completion(); 
       } 
      }); 
     } 
    }]; 
} 

- (void)saveWithCompletion:(void(^)(void))completion { 
    [self performBlock:^{ 
     NSError *error = nil; 
     if ([self save:&error]) { 
      NSNumber *contextID = [self.userInfo objectForKey:@"contextID"]; 
      if (contextID.integerValue == VKCoreDataManagedObjectContextIDMainThread) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        if (completion) { 
         completion(); 
        } 
       }); 
      } 
      [[self class] logContextSaved:self]; 
      if (self.parentContext) { 
       [self.parentContext saveWithCompletion:completion]; 
      } 
     } else { 
      [VKCoreData handleError:error]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (completion) { 
        completion(); 
       } 
      }); 
     } 
    }]; 
} 

ve

+ (void)saveDataInBackgroundWithBlock:(void(^)(NSManagedObjectContext *localContext))saveBlock 
          completion:(void(^)(void))completion; 

+ (NSManagedObjectContext *)newMergableBackgroundThreadContext; 

- (void)saveWithCompletion:(void(^)(void))completion; 

örnek kullanıyor: Ben benzer vardı

[NSManagedObjectContext saveDataInBackgroundWithBlock:^(NSManagedObjectContext *localContext){ 
// do your stuff with local context 
} completion:^{ 
// handle completion, update UI or something 
}]; 
+0

teşekkürler. MR olmadan da çok benzer bir şey yaptık. – disappearedng

2

M kullanarak sorunlar Birkaç hafta önce. Sonunda, onu terk etmeye ve her şeyi kendim yapmaya karar verdim. Probleminize gerçekten bir çözüm değil, ama benim arkamdaki akıl yürütme sesidir. Muhtemelen MR için asıl kaynağa gitmelisiniz. Belgelerin büyük bir kısmı yanlıştır ve kütüphanenin adil bir miktarı sadece kaynağı okuyarak öğrenilebilir. Muhtemelen MR ile arka plan işlemeye çalışmakla ilgili bir sorun var.

Kodunuz iOS6 + içinse, o zaman Master-Main-Child Bağlam ayarını kullanmalısınız. Dispatch_async kullanımı muhtemelen bir problemdir. Çekirdek Verilerinizin [NSManagedContext performBlock:] yöntemini kullanarak iş parçacığınızı yönetmesine izin vermek, muhtemelen tüm dünya için daha güvenlidir.

iOS5 veya daha düşük bir sürümünü kullanıyorsanız, Çocuk içeriği ve performBlock: kodu çalışmaz. En kolay çözüm, Çekirdek Verileri iş parçacıklarınızdan uzak tutmaktır. Yeni thread/bloğa girmeden önce gerekli bilgileri Çekirdek Verilerden çekin. Bu verileri bloğunuza aktarın ve gerekli işlemleri yapın. Ardından, bir türdeki bir sözlük/nesne içindeki ana iş parçacığına geri dönün ve Çekirdek Verilerinizi orada kaydeder.

Ayrıca bir yan not, görüntülerin indirilmesi ve bunları Çekirdek Verilere kaydetme nedeniyle bu konuya da rastladım, bu sorulara son birkaç hafta içinde sorduğum/çözdüğünüz sorulara bakmak isteyebilirsiniz.Daha sonra bazı saç koparma size kurtarabilir:

Can I access the files used for external binary storage in Core Data?

sonunda yerine dosyalar için Çekirdek Verilerin kendi depolama mekanizması kullanarak bana yol ve hangi sonunda bu sorunu/çözümü bana yol

:

Files are no longer readable after updating application to newest version

+0

Teşekkürler. Ben de kendimi bıraktım – disappearedng

İlgili konular