2012-12-02 3 views
0

로컬 알림을 만드는 앱이 있습니다. 앱이 종료되면 (예 : 실행 중이 아니거나 백그라운드에서 실행 중) 알림에서 실행되면 앱이 충돌합니다. 나는 (아래 주석에 명시된) 출력되는 라인 응용 프로그램을 충돌한다 내기 위해 관리했습니다 : I 관리되는 개체 컨텍스트, 영구 저장소 코디네이터 및 관리 개체 모델을 얻기 위해 다음과 같은 세 기능을 사용하고iOS - 로컬 알림에서 시작할 때 관리되는 개체 컨텍스트가 충돌 함

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
// Override point for customization after application launch. 
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque]; 

// Initialise the main view 
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; 

// Initialise a Navigation Controller 
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.viewController]; 

// Set the ViewController as the rootViewController of the window 
self.window.rootViewController = nav; 

// Colour the navigation bar 
nav.navigationBar.tintColor = [UIColor colorWithRed:0.07f green:0.59f blue:0.94f alpha:1]; 

// Set the background 
if (isPhone568) { 
    self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"santa_back5.png"]]; 
} 
else { 
    self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"santa_back.png"]]; 
} 

[self.window makeKeyAndVisible]; 
[nav release]; 

self.viewController.managedObjectContext = [self managedObjectContext]; 

application.applicationIconBadgeNumber = 0; 

// Handle launching from a notification 
UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 
if (localNotif) { 
    NSPredicate *predicate = [NSPredicate 
           predicateWithFormat:@"(dateCreated like %@)", 
           [localNotif.userInfo objectForKey:@"dateCreated"]]; 

    LetterViewController *letterView = [[LetterViewController alloc] initWithNibName:@"LetterViewController" bundle:nil]; 

    // Get the letter to pass on 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Letter" inManagedObjectContext:[self managedObjectContext]]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setPredicate:predicate]; 
    NSError *error; 
// 
// THIS NEXT LINE IS CRASHING THE APP 
// 
    NSArray *letters = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error]; 
    Letter *myLetter = [letters objectAtIndex:0]; 

    letterView.theLetter = myLetter; 
    //[myLetter release]; 

    // Pass the selected object to the new view controller. 
    [self.viewController.navigationController pushViewController:letterView animated:YES]; 
    [letterView release]; 
    [fetchRequest release]; 
} 

return YES; 
} 

:

//Explicitly write Core Data accessors 
- (NSManagedObjectContext *) managedObjectContext { 
if (managedObjectContext != nil) { 
    return managedObjectContext; 
} 
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
if (coordinator != nil) { 
    managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
} 
return managedObjectContext; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
if (managedObjectModel != nil) { 
    return managedObjectModel; 
} 
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

return managedObjectModel; 
} 

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
if (persistentStoreCoordinator != nil) { 
    return persistentStoreCoordinator; 
} 
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
              stringByAppendingPathComponent: @"<Project Name>.sqlite"]]; 
NSError *error = nil; 
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
           initWithManagedObjectModel:[self managedObjectModel]]; 
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
              configuration:nil URL:storeUrl options:nil error:&error]) { 
    /*Error for store creation should be handled in here*/ 
} 

return persistentStoreCoordinator; 
} 

- (NSString *)applicationDocumentsDirectory { 
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
} 

이 문제를 해결하는 데 도움을 주시면 큰 도움이 될 것입니다. 사전에

감사합니다.

+1

오류 로그가 나타 납니까? – aahsanali

답변

0

몇 가지. 메인 스레드에서 코어 데이터를 사용하는 것처럼 보입니다. 그렇다면 모든 스레드가이 스레드에 있어야합니다. 블록을 사용하는 새로운 '수행'API를 사용하려면 언젠가 코드를 업데이트해야합니다.

localNotif 코드가 시작 대리인에서 과도한 작업을 수행하기 때문에 일부 시간 동안 반환되지 않으며 iOS가 앱을 종료시킬 수 있습니다. 동일한 코드를 가져 와서 메인 큐에 게시 된 파견 블록에 넣으면 작동합니다. 네비게이션 컨트롤러 속성이 있는지 확인하기 위해 어설 션을 추가하십시오.

+0

이 정보를 제공해 주셔서 감사합니다! 나는 이것에 대해 몰랐고 그것을 들여다 볼 것입니다! –

0

답변 해 주셔서 감사합니다. 내 문제가 술어와 같았 어! 그것은 where 절에서 "like"를 사용하는 것을 좋아하지 않습니다. 나는 그것을 =로 바꾸었다.

관련 문제