我有很奇怪的问题,因为我根本不理解什么进展,所以我想解释一下。 情况如下:
我有一个带有UIScrollView和三个子视图的视图控制器。这三个子视图有方法。
-(void)loadContent
使用CoreData在后台线程中从数据库中加载内容,创建表示已加载项目的子视图,并将它们作为自己的子视图添加,调用[self addSubview:itemView]。该方法被调用为:
[self performSelectorInBackground: @selector(loadContent) withObject: nil];
我正在使用单例服务类从数据库加载数据。一切正常,但是当这三个视图加载它们的数据时,有时会崩溃应用程序。
我猜测这是因为它共享了一个NSManagedObjectContext实例,供所有读操作使用,因此我重新编写了该类,只共享NSManagedObjectModel和NSPersistentStoreCoordinator实例,并且创建它自己的NSManagedObjectContext实例。
突然发生了非常奇怪的事情。数据被成功加载,子视图被创建并添加到视图层级结构中,但它从未显示在屏幕上。当我切换回旧的单例服务类(共享一个managedObjectContext)时,它像魔术般地重新工作了! (但有崩溃应用程序的风险)。
我完全不明白从数据库加载数据与在屏幕上显示项目之间的关系。更多的是,当子视图被创建并添加到视图层次结构时,为什么它不显示?
这个源看起来像这样:
- (void) loadContent {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *results = [(WLDataService *)[WLDataService service] loadItemsForGDView];
NSUInteger channelPosition = 0;
CGFloat position = 0.0;
CGFloat minuteWidth = ((self.superview.frame.size.width / 2.0) / 60.0);
for(Item *it in results) {
/// On following lines size and position of the view is computed according to item setup - skipping here...
/// Create item; it s simple subclass of UIView class
WLGDItemView *item = [[WLGDItemView alloc] init];
/// Variables used here are declared above when size and position is computed
item.frame = CGRectMake(itemX, itemY, itemWidth, itemHeight);
[self performSelectorOnMainThread: @selector(addSubview:) withObject: item waitUntilDone: NO];
/// This is just helper macro to release things
WL_RELEASE_SAFELY(item);
}
[pool drain];
}
基本服务类别(非单列)的执行如下(有意思的部分):
#import "WLLocalService.h"
static NSPersistentStoreCoordinator *sharedPSC = nil;
static NSManagedObjectModel *sharedMOM = nil;
@implementation WLLocalService
@synthesize managedObjectContext;
/// This is here for backward compatibility reasons
+ (WLLocalService *) service {
return [[[self alloc] init] autorelease];
}
#pragma mark -
#pragma mark Core Data stack
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext == nil) {
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
[managedObjectContext setUndoManager: nil];
[managedObjectContext setMergePolicy: NSMergeByPropertyStoreTrumpMergePolicy];
}
return managedObjectContext;
}
- (NSManagedObjectModel *) managedObjectModel {
if(sharedMOM == nil) {
sharedMOM = [[NSManagedObjectModel mergedModelFromBundles: nil] retain];
}
return sharedMOM;
}
- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
if(sharedPSC == nil) {
NSURL *storeUrl = [self dataStorePath];
NSError *error = nil;
sharedPSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![sharedPSC addPersistentStoreWithType: NSSQLiteStoreType configuration: nil URL: storeUrl options: nil error: &error]) {
WLLOG(@"%@: %@", error, [error userInfo]);
}
}
return sharedPSC;
}
#pragma mark -
#pragma mark Path to data store file
- (NSURL *) dataStorePath {
return [NSURL fileURLWithPath: [WL_DOCUMENTS_DIR() stringByAppendingPathComponent: @"/DB.sqlite"]];
}
- (void)dealloc {
WL_RELEASE_SAFELY(managedObjectModel);
[super dealloc];
}
@end
我非常想知道这里发生了什么,为什么它表现得那么奇怪(当然,特别是为什么它不起作用)。有人能够解释一下吗?
感谢所有人