2011-09-01 6 views
0

질문 대답했다 // basicly 내가 적은 더/코드를 잘해야합니다 :) 내 응용 프로그램이 시작 내가 먼저 시작 화면을로드 할 때NSNotificationCenter 알림이 전송되지/

이되는 SplashScreen은 데이터 다운로드가 시작됩니다 받았을 때 화면 자체 수행 로딩 :

Splash.m는

는 는 는 알림 데이터를 분석 멀리 저장 될 때마다 DataManager에 다음 별도의 스레드에서 데이터를로드 및 구문 분석 Dataloader에 자사의 인스턴스를 사용하여 진행됩니다

입니다

@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 
DataLo에서 보낸 ader. 이전에 많은 경우에 알림 작업을했는데 이번에는 작동하지 않으며 이유를 파악할 수 없습니다. 오류 또는 기타 사항은 없지만 옵저버에 설정된 기능은 절대로 호출되지 않습니다. 무엇이 잘못되었는지에 대한 아이디어는 대단히 환영합니다. 여기, 그리고 다른 사이트에서 꽤 많은 글을 읽었지만 아직 내 대답을 찾지 못했습니다.

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

, 당신은 return 문 전에 등록 코드를 삽입해야합니다. 그렇지 않으면 절대 실행되지 않습니다.

건배!

+0

방금 ​​나를 울게 만들었고, 미소 짓고, 바보스럽고 행복하게 생각했습니다. * facepalm * 감사합니다! – ophychius

+0

기꺼이 도와 드리겠습니다! 그것은 모두에게 일어납니다 :) 환호. – Lio

관련 문제