2013-02-14 18 views
5

Tôi có đoạn mã sau:MagicalRecords vẫn tồn tại trong chuỗi nền với tìm nạp hình ảnh?

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); 
    }]; 
}); 

tôi dường như nhận được rất nhiều những điều sau đây:

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 

Với các thông báo lỗi sau:

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) 

Tôi tránh để sử dụng saveInBackgroundWithBlock vì nó không được dùng nữa (tài liệu cần được cập nhật?)

Bất kỳ ý tưởng nào có vấn đề với mã của tôi?

CẬP NHẬT

đội của tôi đã quyết định rằng MagicalRecord là quá lỗi cho bây giờ. Chúng tôi đã hoàn toàn di chuyển mã của chúng tôi ra khỏi MR trở lại CoreData. Cảm ơn đã quan tâm.

+0

Mục tiêu chính của bạn là gì? –

Trả lời

0

Bạn đã thử MR_saveOnlySelfWithCompletion: chưa?

2

Tôi gặp vấn đề tương tự! Nó đã được cố định chỉ khi tôi đã tiết kiệm bối cảnh bằng cách tự của tôi bằng tay mà không có MR.

đây là giải pháp của tôi:

NSManagedObject + MyCategory.h

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

+ (NSManagedObjectContext *)newMergableBackgroundThreadContext; 

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

.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(); 
       } 
      }); 
     } 
    }]; 
} 

và ở đây đang sử dụng mẫu:

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

cảm ơn. Chúng tôi đã làm một cái gì đó rất giống nhau mà không có MR quá. – disappearedng

2

tôi đã tương tự vấn đề khi sử dụng M R cách đây vài tuần. Cuối cùng tôi quyết định bỏ nó và tự làm mọi thứ. Không thực sự là một giải pháp cho vấn đề của bạn, nhưng lý do đằng sau tôi thả nó là âm thanh. Bạn có thể cần phải đi và nhìn vào nguồn thực tế cho MR. Phần lớn tài liệu là không chính xác và số tiền hợp lý của thư viện chỉ có thể được học bằng cách đọc nguồn. Có nhiều khả năng là một vấn đề với việc cố gắng xử lý nền với MR.

Nếu mã của bạn dùng cho iOS6 +, thì bạn chỉ nên sử dụng thiết lập bối cảnh Master-Main-Child. Sử dụng dispatch_async cũng có thể là một vấn đề. Cho phép Core Data quản lý luồng của bạn bằng cách sử dụng phương thức [NSManagedContext performBlock:] có lẽ là một thế giới an toàn hơn.

Nếu bạn đang sử dụng iOS5 trở xuống, ngữ cảnh Con và mã performBlock: không hoạt động. Giải pháp đơn giản nhất là giữ cho Dữ liệu cốt lõi ra khỏi chủ đề của bạn. Kéo bất kỳ thông tin cần thiết nào từ Dữ liệu chính trước khi nhập chuỗi/chuỗi mới. Chuyển dữ liệu đó vào khối của bạn và thực hiện bất kỳ xử lý cần thiết nào. Sau đó trả lại chủ đề chính của bạn trong một từ điển/đối tượng của một số loại, và thực hiện dữ liệu cốt lõi của bạn tiết kiệm ở đó.

Ngoài ra một lưu ý phụ, tôi đã gặp phải vấn đề này vì tải xuống hình ảnh và lưu chúng vào Dữ liệu cốt lõi, bạn có thể muốn xem những câu hỏi này mà tôi đã hỏi/giải quyết trong vài tuần gần đây liên quan đến điều đó.Có thể giúp bạn tiết kiệm kéo một số tóc ra sau:

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

mà cuối cùng dẫn tôi sử dụng cơ chế lưu trữ riêng của tôi thay vì dữ liệu cốt lõi cho các tập tin, và mà cuối cùng đưa tôi đến với vấn đề này/giải pháp:

Files are no longer readable after updating application to newest version

+0

Cảm ơn. Tôi cũng thả bản thân MR – disappearedng