我一直在纏着我的大腦,還有很多搜索,但目前還沒有運氣。Singleton類DataLoader - 從AppDelegate中的Core Data設置值,但無法訪問其他類中的DataLoader變量
基本上,我已經設置Core Data來將數據從我的AppDelegate類中的sqlite數據庫加載到名爲DataLoader的單例類中的共享變量中。
我也有一個名爲GameScene的主類,它也將使用DataLoader數據。
我所試圖做的是如下:
- 負載從數據庫中的DataLoader單例類變量(特別是一個NSMutableArray)數據(使用後臺線程),並存儲結果
- 這樣,數據在場景轉換到主菜單區域時加載
- 在GameScene類中,我嘗試訪問存儲在DataLoader單例中的數據,並在遊戲中使用這些數據。
我的問題是,雖然我可以看到我存儲在AppDelegate類的對象,我似乎不能夠在GameScene類返回的對象。通常以EXC_BAD_ACCESS錯誤結束。
我真的在尋找一些類似的東西或者如果你有任何想法的例子。
如果您需要代碼示例,請告訴我。
謝謝, Pras。
* 編輯 - 代碼段 *
DataLoader.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface DataLoader : NSObject {
}
//setup singleton
+(DataLoader *) sharedDataLoader;
@property (nonatomic, retain) NSMutableArray * veHint;//2 characters
DataLoader.m
#import "DataLoader.h"
#import <CoreData/CoreData.h>
@implementation DataLoader
@synthesize veHint;
static DataLoader * myDataLoader = nil;
+(DataLoader *) sharedDataLoader{
if(myDataLoader == nil){
myDataLoader = [[[DataLoader alloc]init]retain];
}
return myDataLoader;
}
-(id) init
{
if((self = [super init])){
veHint = [NSMutableArray arrayWithCapacity:10];
}
return self;
}
AppDelegate.mm
#import "AppDelegate.h"
#import "GameScene.h"
#import "RootViewController.h"
#import "Word.h"
#import "DataLoader.h"
-(void) applicationDidFinishLaunching:(UIApplication*)application
{
//other standard stuff here...
//my load data method using data loader
[self getRandomData];
//other standard stuff here...
// Run the intro Scene
[[CCDirector sharedDirector] runWithScene: [GameScene node]];
}
//other standard methods for Core Data
//Random data loader
-(void) fetchRandomData: (NSString *) searchInteger{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"fetching random data for word size: %@", searchInteger);
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Word" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
//setup predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY %K == %@", @"size", searchInteger];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
NSLog(@"fetch results count = %i", [fetchResults count]);
[request release];
NSMutableArray * results = [NSMutableArray arrayWithCapacity:10];
NSMutableArray * fetchedIndexes = [NSMutableArray arrayWithCapacity:10];
//get the total count, randomize selection of 10 results from the list
int j = 0;
while (j<10) {
int index = arc4random() % [fetchResults count];
//get only unique values
if ([fetchedIndexes containsObject:[NSNumber numberWithInt:index]] == false) {
[fetchedIndexes addObject:[NSNumber numberWithInt:index]];
Word * word = (Word *) [fetchResults objectAtIndex:index];
//NSLog(@"j = %i, index = %i, wordsize = %@, wordstring = %@",j, index, word.size, word.wordString);
[results addObject:word];
j++;
}
}
//set dataloader
[[DataLoader sharedDataLoader] setVeHint:results];
[pool drain];
}
另外,需要提及的是EXC_BAD_ACCESS位於AppDelegate.mm的[pool drain]調用中。
在此先感謝您的幫助。
是,示例代碼將明確您的問題,並使其更容易找到問題。 – 2012-01-16 23:01:30
這麼多的事情可以去錯在生活......我不知道該選哪一個...... ;-(你如何嘗試在你的單身進入電影數據,以及如何你單身的定義。你線程與安全這個單?這些信息將幫助我們來幫助你。 – 2012-01-16 23:01:40
嗨,大家好,感謝您的快速回復。該代碼是非常相似的雷Wenderlich的核心數據教程([http://www.raywenderlich.com/934/core-data-tutorial我有一個sqlite數據庫,它被加載了,然後我有一個方法getRandomData(),它包含了NSFetchRequest,在這個方法中,我獲取的結果被過濾了,這個是我設置的數據加載器的NSMutableArray變量 有從這個核心數據的方法非常小的偏差,所以我不知道如果回答您的問題 [1]:?http://www.raywenderlich.com/934 /核心數據教程工具入門 – prazzledazzle 2012-01-17 22:59:27