2011-09-01 75 views
0

//問題得到回答,basicly我應該多睡覺/代碼少:)NSNotificationCenter通知不被髮送/接收

當我的應用程序開始我先裝入一個閃屏,這個啓動畫面將啓動數據下載時,屏幕本身加載完成:

Splash.m

@implementation Splash 


- (id) init 
{ 
    self = [super init]; 

    _lblFunds = [[UILabel alloc] initWithFrame:CGRectMake(350, 330, 324,28)]; 
    _lblFunds.numberOfLines = 1; 
    [_lblFunds setFont:[UIFont systemFontOfSize:24.0]]; 
    [_lblFunds setTextAlignment: UITextAlignmentCenter]; 
    [_lblFunds setText:@".. Fondsen .."]; 
    [self.view addSubview:_lblFunds]; 


    _lblObjects = [[UILabel alloc] initWithFrame:CGRectMake(350, 360, 324,28)]; 
    _lblObjects.numberOfLines = 1; 
    [_lblObjects setFont:[UIFont systemFontOfSize:24.0]]; 
    [_lblObjects setTextAlignment: UITextAlignmentCenter]; 
    [_lblObjects setText:@".. Vastgoed Objecten .."]; 
    [self.view addSubview:_lblObjects]; 


    _lblCustomers = [[UILabel alloc] initWithFrame:CGRectMake(350, 390, 324,28)]; 
    _lblCustomers.numberOfLines = 1; 
    [_lblCustomers setFont:[UIFont systemFontOfSize:24.0]]; 
    [_lblCustomers setTextAlignment: UITextAlignmentCenter]; 
    [_lblCustomers setText:@".. Clienten .."]; 
    [self.view addSubview:_lblCustomers]; 
    return self; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fundsLoaded) name:@"FundsDone" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customersLoaded) name:@"CustomersDone" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectsLoaded) name:@"ObjectsDone" object:nil]; 
} 


- (void) fundsLoaded 
{ 
    [_lblFunds setText:[NSString stringWithFormat:@"Fondsen geladen: %d",[[DataManager sharedInstance] fundsCount]]]; 
} 

- (void) objectsLoaded 
{ 
    [_lblObjects setText:[NSString stringWithFormat:@"Vastgoed Objecten geladen: %d",[[DataManager sharedInstance] objectsCount]]]; 
} 

- (void) customersLoaded 
{ 
    [_lblCustomers setText:[NSString stringWithFormat:@"Clienten geladen: %d",[[DataManager sharedInstance] customersCount]]]; 
} 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[DataManager sharedInstance] getData]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return YES; 
} 

@end 

然後將DataManager的繼續使用它的DataLoader的實例在一個單獨的線程,加載和分析數據,只要數據被分析並存儲起來的通知從DataLo發送阿德。如果之前有過很多通知,但這次它不起作用,我似乎無法弄清楚爲什麼不能。沒有任何錯誤或者任何錯誤,但是在觀察者中設置的函數從不會被調用。對於什麼是錯誤的任何想法都非常受歡迎,我在這裏閱讀了很多主題,而其他網站卻還沒有找到我的答案。

DataManager.m

@implementation DataManager 

static DataManager* _dataManager = nil; 
static DataLoader *_dataLoader = nil; 
static bool _dataLoaded = FALSE; 

- (int) fundsCount 
{ 
    return _dataLoader.funds_count; 
} 

- (int) objectsCount 
{ 
    return _dataLoader.objects_count; 
} 

- (int) customersCount 
{ 
    return _dataLoader.customers_count; 
} 

+ (DataManager *) sharedInstance{ 
    @synchronized([DataManager class]) 
    { 
     if(!_dataManager) 
     { 
      _dataManager = [[super alloc] init]; 

      _dataLoader = [[DataLoader alloc] init]; 
     } 
     return _dataManager; 

    } 
    return nil; 
} 

- (void) loadDataSucces 
{ 
    _dataLoaded = TRUE; 
} 


- (void) _getData 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    if(_dataLoader) 
    { 

     [_dataLoader loadData]; 

    } else 
    { 
     NSLog(@"DataLoader not initialized"); 
    } 
    [pool drain]; 
} 

- (void) getData 
{ 
    [NSThread detachNewThreadSelector:@selector(_getData) toTarget:self withObject:nil]; 
} 

@end 

DataLoader.m

- (void) parseData: (NSString *) jsonString 
{ 

    NSError *err; 
    SBJsonParser *parser = [[SBJsonParser alloc] init]; 
    id object = [parser objectWithString:jsonString error:&err]; 
    [jsonString release]; 


    if (!object) { 

    } else { 

     //funds 
     id funds = [object objectForKey:@"fondsen"]; 


     [self deleteAllEntitiesOfType:@"Fund"]; 

     int nr = 0; 

     for (NSDictionary *i in funds) 
     { 
      NSString *naam = [i objectForKey:@"naam"]; 

      if([naam length] > 2) 
      { 
       NSManagedObjectContext *context = [(CatalogusAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 


       Fund *f = [NSEntityDescription insertNewObjectForEntityForName:@"Fund" inManagedObjectContext: context]; 
       NSString *integertje = [i objectForKey:@"oid"]; 
       int in = [integertje integerValue]; 
       [f setOid: [NSNumber numberWithInt: in ]]; 
       [f setNaam: naam]; 
       NSError *error = nil; 
       if(![context save: &error ]) 
       { 
        NSLog(@"Error: %@", [[error userInfo] valueForKey:@"ErrorString"]); 
       } else 
       { 
        nr++; 
       } 

      } 

     } 
     funds_count = nr; 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"FundsDone" object:nil]; 
     //objects 



     if(true) 
     { 
      id objects = [object objectForKey:@"vastgoedobjecten"]; 


      [self deleteAllEntitiesOfType:@"Object"]; 

      nr = 0; 
      NSManagedObjectContext *context = [(CatalogusAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

      for (NSDictionary *i in objects) 
      { 



       Object *o = [NSEntityDescription insertNewObjectForEntityForName:@"Object" inManagedObjectContext: context]; 

       [o setFondsOid:[NSNumber numberWithInt: [ [i objectForKey:@"fondsOid"] integerValue] ]]; 
       [o setOid: [NSNumber numberWithInt: [ [i objectForKey:@"oid"] integerValue] ]]; 
       [o setAdres:[i objectForKey:@"adres"]]; 
       [o setPostcode:[i objectForKey:@"postcode"]]; 
       [o setPlaats: [ i objectForKey:@"plaats"]]; 
       [o setProvincie:[i objectForKey:@"provincie"]]; 
       [o setStatus:[i objectForKey:@"status"]]; 
       [o setSegment:[i objectForKey:@"segment"]]; 
       [o setOppervlakte:[NSNumber numberWithInt: [ [i objectForKey:@"oppervlakte"] integerValue] ]]; 
       [o setBelangrijksteHuurder:[i objectForKey:@"belangrijksteHuurder"]]; 
       [o setWeging:[i objectForKey:@"weging"]]; 
       [o setLongitude:[NSNumber numberWithDouble: [ [i objectForKey:@"longitude"] doubleValue] ]]; 
       [o setLatitude:[NSNumber numberWithDouble: [ [i objectForKey:@"latitude"] doubleValue] ]]; 
       NSError *error = nil; 
       if(![context save: &error ]) 
       { 
        NSLog(@"Error: %@", [[error userInfo] valueForKey:@"ErrorString"]); 
       } else 
       { 
        nr++; 
       } 
      } 

      objects_count = nr; 
      NSLog(@"ObjectsLoaded"); 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"ObjectsDone" object:nil]; 

     } 

     //customers 
     if(true) 
     { 
      id custs = [object objectForKey:@"klanten"]; 


      [self deleteAllEntitiesOfType:@"Customer"]; 

      nr = 0; 
      NSManagedObjectContext *context = [(CatalogusAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

      for (NSDictionary *i in custs) 
      { 



       Customer *c = [NSEntityDescription insertNewObjectForEntityForName:@"Customer" inManagedObjectContext: context]; 


       [c setOid: [NSNumber numberWithInt: [ [i objectForKey:@"oid"] integerValue] ]]; 
       [c setFondsOid:[NSNumber numberWithInt: [ [i objectForKey:@"fondsOid"] integerValue] ]]; 
       [c setNaam: [i objectForKey:@"naam"]]; 


       NSError *error = nil; 
       if(![context save: &error ]) 
       { 
        NSLog(@"Error: %@", [[error userInfo] valueForKey:@"ErrorString"]); 
       } else 
       { 
        nr++; 
       } 
      } 

      customers_count = nr; 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"CustomersDone" object:nil]; 

     } 

    } 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"DataReady" object:nil]; 

} 

- (void) loadData{ 

    NSString *urlString = @"URL"; 

    NSDate *startDownload = [NSDate date]; 

    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlString] 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 

    NSURLResponse *response = nil; 
    NSError *error = nil; 



    NSData *dataFeed = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error]; 
    if(error){ 

     NSString *d = [ error description ]; 
     NSLog(@"error: %@",d); 
    } int bytes = [dataFeed length]; 

    NSDate *endDownload = [NSDate date]; 



    NSString *data = [[NSString alloc] initWithData:[NSData decompress:dataFeed] encoding:NSStringEncodingConversionExternalRepresentation]; 

    int string = [data length]; 

    NSDate *endDecompress = [NSDate date]; 

    NSLog(@"Download data: %f - Decompress: %f - BytesDownloaded: %d", [endDownload timeIntervalSinceDate:startDownload], [endDecompress timeIntervalSinceDate:endDownload], bytes); 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"DownloadDone" object:nil]; 

    [self parseData:data]; 

} 

回答

3

在初始化,您應該把您的註冊代碼之前返回語句。否則它永遠不會運行。

乾杯!

+0

你剛剛讓我哭,微笑,感到愚蠢和快樂在同一時間* facepalm *謝謝! – ophychius

+0

很高興我能幫忙!它發生在每個人:)乾杯。 – Lio