2011-03-11 2 views
0

Je crée une application pour envoyer des messages OSC via WLAN.
C'est pourquoi j'ai une entité "Réseau" avec un seul objet dedans. Cause de cela, je veux un Singleton pour aller chercher cet objet.
Dans AppDelegate i créé un classmethod pour obtenir le ManagedObjectContextSingleton pour récupérer CoreData, se bloque sur [fetchedResultsController_ performFetch: & error]

static NSManagedObjectContext* manObCon; 

@implementation... 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    manObCon = self.managedObjectContext; 
... 
} 

+ (NSManagedObjectContext*) getManObCon{ 
    return manObCon; 
} 

le managedObjectContext arrive avec une adresse dans mon singleton, donc je pense que cela devrait fonctionner.
Singleton.h (rien de spécial ici)

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 
#import "OSC_iPadAppDelegate.h"; 
#import "Network.h"; 

@interface NetworkSingleton : NSObject <NSFetchedResultsControllerDelegate> { 
} 
+ (Network*) getNetwork; 
+ (void) insertNewObject; 
+ (NSFetchedResultsController *)fetchedResultsController; 
@end 

Singleton.m APP AT [fetchedResultsController_ performFetch:&error] avec ACCIDENTS

warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/usr/lib/info/dns.so (file not found). 
Program received signal: “EXC_BAD_ACCESS”. 
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found). 
kill 
quit 

Heres Code de Singleton.m

#import "NetworkSingleton.h" 
static Network* _network; 
static NSFetchedResultsController *fetchedResultsController_; 
static NSManagedObjectContext *managedObjectContext_; 

@implementation NetworkSingleton 

+ (Network*) getNetwork{ 
    managedObjectContext_ = [OSC_iPadAppDelegate getManObCon]; //get the managedObjectContex from AppDelegate 
//fetchedResultsController init 
    fetchedResultsController_ = [NetworkSingleton fetchedResultsController]; //get fetchedResultsController 
//check if _network is set 
    if (_network == nil) { 
     id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController_ sections] objectAtIndex:0]; 
//if not set, check if there is already an network object in coredata 
     if ([sectionInfo numberOfObjects] == 0) { 
      //Create new Networkobject, if no one is existing 
      [NetworkSingleton insertNewObject]; 
      fetchedResultsController_ = nil; 
     } 
//set _network 
     _network = [fetchedResultsController_ objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 
    } 
    return _network; 
} 

+ (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController_ != nil) { 
     return fetchedResultsController_; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Network" inManagedObjectContext: managedObjectContext_]; 
    [fetchRequest setEntity:entity]; 

    [fetchRequest setFetchBatchSize:1]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sourcePort" ascending:YES selector:nil]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext_ sectionNameKeyPath:nil cacheName:nil]; 
    aFetchedResultsController.delegate = self; 
    fetchedResultsController_ = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [fetchRequest release]; 
    [sortDescriptor release]; 
    [sortDescriptors release]; 

    NSError *error = nil; 
    /* 
    APP CRASHES HER 
    */ 
    if (![fetchedResultsController_ performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return fetchedResultsController_; 
}  
@end 

donc je ne sais pourquoi le fetchedResultsController_ ne fait pas ce qu'il fait le mieux - aller chercher
ce n'est pas nul mais je ne peux pas comprendre l'Errormessage et rien trouvé ob Google ou ailleurs.
Le problème pourrait être, que j'ai besoin d'initier le fetchedResultsController par moi-même, car il ne init pas automatiquement comme dans les contrôleurs de vue générés.

Merci pour votre aide

+0

Ceci est une mauvaise conception. Un fetchedResultsController est destiné à être le contrôleur entre une couche de modèle de données de base et une couche de vue UITableView. Cela va à l'encontre du but de la FRC de le faire tenir par un objet modèle singleton. Vous avez brisé votre modèle et contrôlé les calques ensemble et avez codé en dur votre tableview aux données. – TechZen

+0

Je ne l'utilise pas comme TableView dans ce cas. J'ai besoin du singleton parce que j'utilise les données dans plusieurs classes qui ne sont pas des vues. Mais comment puis-je enregistrer une seule instance sans CoreData? – Seega

Répondre

3
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext_ sectionNameKeyPath:nil cacheName:nil]; 

fetchedResultsController_ = aFetchedResultsController; 

[aFetchedResultsController release]; 

Lorsque vous utilisez fetchedResultsController_ après ce bloc de code est libéré déjà. Parce que vous l'avez alloué (retainCount + 1) et que vous l'avez libéré (retainCount-1). Vous n'avez pas conservé lorsque vous avez affecté aFetchedResultsController à fetchedResultsController_.

soit le conserver comme celui-ci fetchedResultsController_ = [aFetchedResultsController retain];
ou supprimer la ligne [aFetchedResultsController release];


EDIT: Je viens de voir qu'il pourrait y avoir plus de mal dans votre code.

Vous devez remplacer tous les fetchedResultsController_ en dehors du getter fetchedResultsController par self.fetchedResultsController. Normalement, le _ derrière ou devant une variable devrait vous dire que vous devriez utiliser le setter et le getter, sauf si vous êtes sûr de ce que vous faites.

Et fetchedResultsController_ = [NetworkSingleton fetchedResultsController]; invoque fetchedResultsController_ = aFetchedResultsController;.
Ce qui pourrait fonctionner, mais je ne le ferais pas.

+0

'[aFetchedResultsController release];' était le problème, au problème 'self.fetchedResultsController', les _ symboles que l'attribut est privé et je l'utilise juste dans la classe elle-même, donc ce n'est pas un problème – Seega