2011-11-14 3 views
-2

にWebサービスからデータをロードすると-trouble - アプリケーションdidFinishLaunchingwithOptions (更新)iPhoneは、私はウィンドウベースのアプリケーションを使用して、その後appDelegate部に私の最初のnavigationviewベースのコントローラをアップロードしていますテーブルビュー

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 

    self.window.rootViewController = self.navigationController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

Webサービスからデータを取得する方法は、通常、[self getData]のviewdidload ....というこのメソッドでトリガされます。方法。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 


    if (_refreshHeaderView == nil) { 

     EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)]; 
      view.delegate = self; 
     [self.tableView addSubview:view]; 
     _refreshHeaderView = view; 
     [view release]; 

    } 

    // update the last update date 
     [_refreshHeaderView refreshLastUpdatedDate]; 


     [self loadImages]; 


    HUDMB = [[MBProgressHUD alloc] initWithView:self.view]; 
    [self.view addSubview:HUDMB]; 

    HUDMB.dimBackground = YES; 

     // Regiser for HUD callbacks so we can remove it from the window at the right time 
    HUDMB.delegate = self; 

    HUDMB.labelText = @"Loading.."; 

    [HUDMB show:TRUE]; 
    [self getData]; 
    [self.tableView reloadData]; 



} 

ユーザーが登録されていないか、または資格情報が存在しない場合は、ロードする前にログインビューコントローラに移動します。

- (void)loadView { 
    [super loadView]; 

    if([Preferences isValid]?YES:NO) 
    { 

    } 
    else 
    { 
     int r = arc4random() % 5; 


     switch (r) { 
      case 0: 
      { 
       loginViewController *sampleView = [[loginViewController alloc] initWithNibName:@"loginViewController" bundle:nil]; 
       [self.navigationController presentModalViewController:sampleView animated:YES]; 
       [sampleView release]; 
      } 
       break; 
      case 1: 
      { 
       loginViewController *sampleView = [[loginViewController alloc] initWithNibName:@"loginViewController" bundle:nil];     
       [sampleView setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 
       [self.navigationController presentModalViewController:sampleView animated:YES]; 
       [sampleView release]; 
      } 
       break; 
      case 2: 
      { 
       loginViewController *sampleView = [[loginViewController alloc] initWithNibName:@"loginViewController" bundle:nil]; 
       [sampleView setModalTransitionStyle:UIModalTransitionStyleCrossDissolve]; 
       [self.navigationController presentModalViewController:sampleView animated:YES]; 
       [sampleView release]; 
      } 
       break; 
      case 4: 
      { 
       loginViewController *sampleView = [[loginViewController alloc] initWithNibName:@"loginViewController" bundle:nil]; 
       [sampleView setModalTransitionStyle:UIModalTransitionStylePartialCurl]; 
       [self.navigationController presentModalViewController:sampleView animated:YES]; 
       [sampleView release]; 
      } 
       break; 
      case 3: 
      { 
       loginViewController *sampleView = [[loginViewController alloc] initWithNibName:@"loginViewController" bundle:nil]; 
       [sampleView setModalTransitionStyle:UIModalTransitionStyleCoverVertical]; 
       [self.navigationController presentModalViewController:sampleView animated:YES]; 
       [sampleView release]; 
      } 
       break; 

      default: 
       break; 
     } 
    } 


} 

私はgetdata関数が多くの問題を引き起こしていると思います。ですから、それを追加して、データ検索とシリアライゼーションに使用する対応する関数を追加してみましょう。その後、

-(void)getData{ 


    NSLog(@"loggin into call sheet page"); 

    [self getCallSheetData]; 

    NSLog(@"after call sheet"); 
} 

- (void)getCallSheetData 
{ 

    NSString *postCMD = @"Blah... Blah... Blah..."; 
    NSMutableData *postDataCMD = (NSMutableData *)[postCMD dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSURL *url = [NSURL URLWithString:[Preferences getURL]]; 
     // NSLog(@"get call Sheet"); 
    NSString *postLengthCMD = [NSString stringWithFormat:@"%d", [postDataCMD length]+1]; 
     // NSLog(@"The CS String: %@",[Preferences retriveSession]); 
    requestCMD = [ASIHTTPRequest requestWithURL:url]; 
    [requestCMD setURL:url]; 
    [requestCMD addRequestHeader:@"Content-Length" value:postLengthCMD]; 
    [requestCMD addRequestHeader:@"Content-Type" value:@"application/x-www-form-urlencoded"]; 
    [requestCMD addRequestHeader:@"user-Agent" value:@"Mobile 1.4" ]; 
    [requestCMD addRequestHeader:@"Content-Language" value:@"en-US"]; 
    [requestCMD addRequestHeader:@"Accept-Encoding" value:@"gzip"]; 
    [requestCMD addRequestHeader:@"Cookie" value:[Preferences retriveSession]]; 


    [requestCMD setPostBody:postDataCMD]; 

    [requestCMD setDelegate:self]; 
    [requestCMD startAsynchronous]; 
} 




- (void)requestFinished:(ASIHTTPRequest *)request 
{ 

    NSMutableArray *CSArray = [[NSMutableArray alloc] init]; 
    if([[request responseString] isEqualToString:@"OK"]){ 
     return; 
    } 

     // Use when fetching binary data 
    NSData *responseData = [request responseData]; 
    NSDateFormatter *formatter1=[[NSDateFormatter alloc]init]; 
    [formatter1 setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; 
    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
    [formatter1 setTimeZone:gmt]; 

    NSDateFormatter *formatterFinal=[[NSDateFormatter alloc]init]; 
    [formatterFinal setDateStyle:NSDateFormatterMediumStyle]; 
    [formatterFinal setTimeStyle: NSDateFormatterShortStyle]; 
    [formatterFinal setLocale:[NSLocale currentLocale]]; 

    JSONDecoder *jCSArray = [[JSONDecoder alloc]init]; 



    NSMutableArray *theObject = [jCSArray objectWithData:responseData]; 
     //  CallSheet= [NSMutableArray arrayWithCapacity:50]; 





    for(id key in theObject) 
    { 

     csr = [[CallSheetRecord alloc] init]; 

      //  cName,cCompany,cId,cMemberId,crcStatus,crcTarget,cImportance,cLastContact 
     csr.importance = @"1"; 
     csr.rcstatus = @"1"; 
     csr.rcTarget = @"1"; 
     csr.company = @""; 
     csr.lastContact= @""; 

     if([key valueForKey:@"firstName"] != Nil) 
     { 

      csr.name = [NSString stringWithFormat:@"%@",[key valueForKey:@"firstName"]] ; 

      if ([key valueForKey:@"lastName"] != Nil) { 
       csr.name = [csr.name stringByAppendingString:@" "]; 
       csr.name = [csr.name stringByAppendingString:[NSString stringWithFormat:@"%@",[key valueForKey:@"lastName"]]]; 
      } 

     } 



     if([key valueForKey:@"company"] != Nil) 
     { 

      csr.company = [NSString stringWithFormat:@"%@",[key valueForKey:@"company"]] ; 


     } 

     if([key valueForKey:@"memberId"] != Nil) 
     { 
      csr.memberId = [NSString stringWithFormat:@"%@",[key valueForKey:@"memberId"]] ; 

     } 

     if([key valueForKey:@"id"] != Nil) 
     { 
      csr.id_ = [NSString stringWithFormat:@"%@",[key valueForKey:@"id"]] ; 

     } 

     if([key valueForKey:@"lastContact"] != Nil) 
     { 
      NSDate *finalDate =[formatter1 dateFromString:[NSString stringWithFormat:@"%@",[key valueForKey:@"lastContact"]]]; 


       //NSString *timeStamp = [formatter1 stringFromDate:[finalDate descriptionWithLocale:[NSLocale currentLocale]]]; 
       //NSLog(@"Time stamp : %@",[finalDate descriptionWithLocale:[NSLocale currentLocale]]); 
       //NSLog(@"Time stamp : %@",timeStamp); 
       //csr.lastContact = [key valueForKey:@"lastContact"]; 
      csr.lastContact = [formatterFinal stringFromDate:finalDate]; 


     } 

     if([key valueForKey:@"importance"] != Nil) 
     { 
      csr.importance = [NSString stringWithFormat:@"%@",[key valueForKey:@"importance"]]; 

     } 

     if([key valueForKey:@"rcStatus"] != Nil) 
     { 
      csr.rcstatus= [NSString stringWithFormat:@"%@",[key valueForKey:@"rcStatus"]] ; 

     } 

     if([key valueForKey:@"rcTarget"] != Nil) 
     { 
      csr.rcTarget = [NSString stringWithFormat:@"%@",[key valueForKey:@"rcTarget"]] ; 

     } 


     [CSArray addObject:csr]; 



    } 
    CSD = [CSArray mutableCopy]; 

    [CSArray release]; 
    [formatter1 release]; 
    [formatterFinal release]; 

     //CallSheetArray = [CSArray mutableCopy]; 
     //[csr release]; 
    [jCSArray release]; 

    [HUDMB hide:TRUE]; 
    [self.tableView reloadData]; 







} 

- (void)requestFailed:(ASIHTTPRequest *)request 
{ 
    NSError *error = [request error]; 
    UIAlertView *message = [[[UIAlertView alloc] initWithTitle:@"Hello World!" 
                 message:[NSString stringWithFormat:@"%@",error] 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]autorelease]; 

    [message show]; 


} 

右その後、私は[自己のgetData]でテーブルをロードしようとします。私はasiHTTP ..を使用してwebserviceの呼び出しを使用してmakeを得ることができます。この質問では、データを取得してデシリアライズするのに3秒かかることがあります。今は...私の質問は、後の実行では、私はユーザー名とパスワードを居住地に保管していますが、最初のインスタンスで....私はlaodにデータを取得することができませんテーブルビュー...私は多くのことを試してみました...

1.最初にデータフェッチメソッドは異なった方法で行われていました。だから私はそれが2.データの解析とデシリアライゼーションのための機能の最後にリロードデータを入れます...何も起こりません。

3.画面は、アプリの連続した起動では良い5秒間に表示何も黒い画面です....私たちはMBPorgressHUDが同じのために実装さのようなものを持つことができます。

これらのシナリオとここからどのような経路を取るべきかについてのガイダンスをお寄せください。 ...

更新: バウンティちょうどあなたができる最高の2つの質問に答える...プロパティは私が試したものでしたが、それは動作しませんでした...しかし、私の問題は...私の問題ではありません私の画面は、私が "リフレッシュする"ようになるまで私がログインした後にWebサービスからデータを読み込むことができないのですか?次に、私のアプリを起動すると、画面を表示するのに約5秒かかります(黒い画面が表示されるまで)。何がアプリケーションに表示されるのかをエンドユーザーに示す最も良い方法は何ですか?私は、ユーザーがアプリが機能していないと思わないようにしたり、電話に悪影響を与えたりしてはいけません。

+0

なぜあなたが答えに問題がある場合は投票してください、そして、提供された情報が不十分であると分かった場合に投票を依頼した人はそれを教えてください。なぜ投票しないの? – medampudi

+1

このような行為で怒らないでください。@medampudi - それはアドレナリンの価値がありません;)。 2番目の考えでは、あなたの質問は実際に理解するのが難しく、あなた自身でいくつかのレビューが必要な場合があります。例えばポイント3は、より多くのソースコードを提供しない限り、私たちが見つけることができないものです。 – Till

+0

データコール用とデータをリロードするときに、いくつかのコードを投稿できますか? –

答えて

0

ここには多数の潜在的な問題があります。最初は[self getData]に関連しています - これはブロックされているかどうかですか?この方法は、あなたが数秒間画面に何も表示されない理由、これは説明します(つまり、すぐに戻らない)ブロックしている場合

1のgetDataは(同期)

をブロックしています。現在、このメソッドはメインスレッドで呼び出されているため、完了するまでUIが更新されなくなります。

あなたは、このことによって、それがバックグラウンドで実行することができます:あなたのメインのコードでは

- (void) getDataInBackgroundThread 
{ 
    NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 

    [self getData]; 

    // force the table to redraw - UI operations must be on the main thread 
    [tableView performSelectorOnMainThread:@selector(reloadData)]; 

    [pool drain]; 
} 

を、今の代わりに、呼び出し[自己のgetData]コール[自己getDataInBackgroundThread]。

2のgetDataは、それがまだUIがハングアップしますメインスレッドで実行されている場合のgetDataは、ブロックしている場合であっても

を(非同期)をブロックされていません。また、多くのプロセッサ時間を使用すると、UIが遅くなり、バックグラウンドで実行されないように見えます。

この問題に対処するには、getDataの長い操作が本当にメインスレッドで実行されていないことを確認し、UIを更新する時間を与えるためにsleep()を頻繁に呼び出す必要があります。

+0

私は基本的にasihttprequestメソッドを使用して非同期メソッドとしてdataDataメソッドを取得します。そして、UIをブロックしないメインスレッドの中にそれを入れました。ここで私はプロセスが遅くなることを理解しています。私が持っているいくつかのブロッキング呼び出しのコード実装をチェックする必要がある方法。しかし、このシナリオでは、すべてのデータがロードされた後でも、私はリロードテーブルを呼び出しますが、それは私に望ましい結果を与えません。 – medampudi

+0

[self.tableview reloadData]とステートメント[tableView performselector]メソッドの違いは何ですか? – medampudi

+0

[self.tableview reloadData]を直接呼び出すと、呼び出し元と同じスレッド(この場合はバックグラウンドスレッド)でコードが実行されます。ただし、すべてのUI呼び出しは、メインスレッド(Apple docsに記載されているように)で行われなければなりません。したがってperformSelectorOnMainThread呼び出しです。 – drmatt

0

あなたはまだ本当に助けてくれる人々のための十分な情報を与えていません。ただ推測しています。

  1. getDataによって遅延が発生している可能性があります。それをコメントアウトするか、確認するためにNSLogステートメントでかっこってください。

  2. 具体的にはgetDataで起こっていることと、データの読み込みに関連するデリゲートまたは通知処理の実装について詳しく説明してください。

  3. [tableView reloadData]viewDidLoadに明示的に呼び出す必要はありません。 tableViewは、最初に表示されたときに自動的にデータを読み込みます。 @dmattとして

あなたが非同期的にデータをロードする場合、その後getDataは遅延なしですぐに戻ってくる、と述べました。データの読み込みとシリアライズが完了したら、テーブルをリロードするために、メッセージやデリゲートの代理(データの読み込み方法によって異なります)に応答します。

あなたに十分な情報があれば、お手伝いをしてくれる人がたくさんいます。特にあなたが賞金を提供するとき。

関連する問題