2012-01-26 12 views
0

こんにちは私は、NSURLConnectionデリゲートメソッドを使用してサーバー上のデバイスに格納されているリストを取得しようとしています。iOS 5:pListの非同期rettrieval - 受信したデータは常に0バイトです

Jeff LaMarcheのiOS 3の本でチュートリアルを見ていて、基本的にはこれらの方法を実装しようとしています。

これらは、実装方法

あるしかし、私はいつも入れません:「0バイトのデータを受信した」私はそれを理解しない:

#pragma -NSURLCOnnection Delegate Methods 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSLog(@"%s %s %d", __FILE__, __FUNCTION__, __LINE__); 
    [receivedData setLength:0]; 
} 
//============================================================================== 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [receivedData appendData:data]; 
    NSLog(@"%s %s %d", __FILE__, __FUNCTION__, __LINE__); 
    if(!self.receivedData) 
    { 
     NSLog(@"Received Data was nil"); 
    } 
} 
//============================================================================== 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 

    UIAlertView *alert1 = [[UIAlertView alloc] 
          initWithTitle:@"Error" 
          message:[NSString stringWithFormat:@" Connection Failed! Error: %@ ,(URL:%@)", [error localizedDescription] ,[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]] 
          delegate:self 
          cancelButtonTitle:@"Cancel" 
          otherButtonTitles:nil]; 
    [alert1 show]; 


    NSLog(@"Connection failed! Error - %@ %@",[error localizedDescription],[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
    NSLog(@"%s %s %d", __FILE__, __FUNCTION__, __LINE__); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"%s %s %d", __FILE__, __FUNCTION__, __LINE__); 

    NSLog(@"Succeeded! Received %d bytes of data",[self.receivedData length]); 
    //Now take the data and convert it into a propertylist 
    NSData *plistData = self.receivedData; 
    NSPropertyListFormat format; 
    NSString *error; 
    id pList = [NSPropertyListSerialization propertyListFromData:plistData 
               mutabilityOption:NSPropertyListImmutable 
                  format:&format 
               errorDescription:&error]; 


    if(!pList) 
    { 
     NSLog(@"There was an error converting data received into a propertyList"); 
     NSLog(error); 
    } 

    self.receivedData = nil; 
    NSLog(@"%s %s %d", __FILE__, __FUNCTION__, __LINE__); 
} 

-(void)retrieveFileFromServerAsynchronously 
{ 
    NSLog(@"%s %s %d", __FILE__, __FUNCTION__, __LINE__); 
    if(![self getURLToGetFileFrom]) 
    {  
     UIAlertView *alert1 = [[UIAlertView alloc] 
           initWithTitle:@"Error" 
           message:@"InvalidPath" 
           delegate:self cancelButtonTitle:@"Cancel" 
           otherButtonTitles:nil]; 
     [alert1 show]; 
    } 

    if(![self getFileName]) 
    { 
     UIAlertView *alert2 = [[UIAlertView alloc] 
           initWithTitle:@"Error" 
           message:@"Invalid FileName" 
           delegate:self cancelButtonTitle:@"Cancel" 
           otherButtonTitles:nil]; 
     [alert2 show]; 


    } 


    NSLog(@"%s %s %d", __FILE__, __FUNCTION__, __LINE__); 

    NSMutableString *urlString = [[NSMutableString alloc] initWithString:[self getURLToGetFileFrom]]; 

    [urlString appendString:[self getFileName]]; 
    NSLog((@"Fetching file from URL %@", urlString)); 

    NSURLRequest *req = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:urlString] 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.00 ]; 

    NSURLConnection *con = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 


    if(con) 
    { 
     NSMutableData *data = [[NSMutableData alloc] init ]; 
     self.receivedData = data; 
     if(!self.receivedData) 
      NSLog(@"Received Data was nil"); 
     NSLog(@"%s %s %d", __FILE__, __FUNCTION__, __LINE__); 
    } 
    else 
    { 
     NSLog(@"%s %s %d", __FILE__, __FUNCTION__, __LINE__); 
     UIAlertView *alert = [[UIAlertView alloc] 
           initWithTitle:@"Error" 
           message:@"Couldn't connect to remote server" 
           delegate:self cancelButtonTitle:@"Cancel" 
           otherButtonTitles:nil]; 
     [alert show]; 
    } 

} 

イムコンソールに上記の出力を得ます。誰かが私にこれを修正し始めるべきなんて考えてもらえますか? 215

fileFetcher.m - [fileFetcher接続:didReceiveResponse:] 183
fileFetcher.m - : - [fileFetcher接続:didReceiveData] [fileFetcher connectionDidFinishLoading]データがnil
fileFetcher.mた受信190
成功しました! 236

どうもありがとう:[fileFetcher connectionDidFinishLoading] - のpropertylistに受信したデータを変換中にエラーが発生しましたデータ
の0バイトを受信
ストリームは、あまりにも数バイト
fileFetcher.mを持っていました。

+0

receivedDataは弱いですか? –

+0

はい、それは弱かったです。そうした問題を抱えていたホーリー****。うわー、その奇妙な、私はこのものをデバッグして約1日を過ごした!! iOS 5のこれらの変更は、私をナッツに追いやっています! ありがとうございます。私の質問に「答える」ことができるので、あなたの答えを受け入れることができます。 – banditKing

+0

これがなぜ起こるのかについてもう少し詳しく説明した回答を追加しました。 –

答えて

0

receivedFileFromServerAsynchronouslyに設定された後、receivedDataがnilになる最も単純な理由は、弱参照であるためにnullになっている場合です。

ローカルの "data"変数を割り当て/初期化すると、強力な参照が作成されますが、ゼロ参照の弱い参照に割り当てられ、メソッドから戻り、 "データ"がスコープから外れ、弱い参照のreceivedDataをゼロにします。

関連する問題