2012-06-06 3 views
2

Я застрял с чем-то сумасшедшим. Я использовал ASIHTTPRequest для получения моих данных из веб-службы, и все сработало нормально. Я переключился на использование NSURLConnection, и я получаю одни и те же данные и разбираю их одинаково, но мой код не будет распознавать данные с помощью NSURLConnection.NSURLConnection и данные JSON

Вот данные я получаю (от NSLog)

Did receive data: {"d":"[{\"id\":1.0,\"Category\":1,\"hPlan\":0.0,\"Tip\":\"It takes 3500 
calories to gain a pound. If you want to lose a pound per week, reduce your calorie 
intake by 250 calories and incorporate daily physical activity that will burn 250 
calories.\",\"TipDate\":\"2012-05-12T00:00:00\",\"TimeStamp\":\"AAAAAAAAB9I=\"}]"} 


2012-06-06 09:42:11.809 StaticTable[27488:f803] Jsson Array: 0 
2012-06-06 09:42:11.809 StaticTable[27488:f803] Jsson Array: (null) 

Код:.

#import "UYLFirstViewController.h" 
#import "MBProgressHUD.h" 
#import "JSON.h" 

@interface UYLFirstViewController() 

@end 

@implementation UYLFirstViewController 

#pragma mark - 
#pragma mark === UIViewController === 
#pragma mark - 

@synthesize MessageField; 
@synthesize jsonArray = _jsonArray; 
@synthesize TipLabelField; 


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    self.title = NSLocalizedString(@"Tickle!", @"Tickle!"); 
    self.tabBarItem.image = [UIImage imageNamed:@"heart_plus"]; 

    [self GetTipOfDay]; 

} 
return self; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 
-(BOOL)GetTipOfDay{ 

NSDate *date = [NSDate date]; 

NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init]; 
[dateFormat setDateFormat:@"EEEE MMMM d, YYYY"]; 
NSString *dateString = [dateFormat stringFromDate:date]; 


NSString *yourOriginalString = @"Tip of the Day for "; 

yourOriginalString = [yourOriginalString stringByAppendingString:dateString]; 
TipLabelField.text = yourOriginalString; 


NSURL *url = [NSURL URLWithString:@"http://www.mysite.com/api/GetHealth.asmx/getTipOfDay"]; 


NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
[request setHTTPMethod:@"GET"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

[NSURLConnection connectionWithRequest:request delegate:self]; 



// Clear text field 
MessageField.text = @""; 

// Start hud 
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    hud.labelText = @"Gathering Tip of the Day..."; 

return TRUE; 

} 

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 

[MBProgressHUD hideHUDForView:self.view animated:YES]; 


NSLog(@"Did receive data: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 


NSDictionary *responseDict = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] JSONValue]; 

NSString *jsonResponse = [responseDict objectForKey:@"d"]; 

self.jsonArray = [jsonResponse JSONValue]; 


NSLog(@"Jsson Array: %d", [jsonArray count]); 
NSLog(@"Jsson Array: %@", jsonArray); 


NSEnumerator *myEnumerator; 
myEnumerator = [jsonArray objectEnumerator]; 
int i; 
i=0; 
id myObject; 

while (myObject = [myEnumerator nextObject]) 
{ 
    NSDictionary *itemAtIndex = (NSDictionary *)[self.jsonArray objectAtIndex:i]; 

    NSLog(@"Checking for games"); 

    NSString *myCheck = [itemAtIndex objectForKey:@"FName"]; 

    if ([myCheck length] != 0) 
    { 
     // NSLog(myCheck); 
     MessageField.text = myCheck; 
    } 
} 

} 



- (void)viewDidUnload { 
[self setMessageField:nil]; 
[self setTipLabelField:nil]; 
[super viewDidUnload]; 
} 
@end 


#import <UIKit/UIKit.h> 

@interface UYLFirstViewController : UIViewController{ 
    NSMutableArray *jsonArray; 
} 
@property (weak, nonatomic) IBOutlet UILabel *MessageField; 
@property (weak, nonatomic) NSMutableArray *jsonArray; 
@property (weak, nonatomic) IBOutlet UILabel *TipLabelField; 

-(BOOL)GetTipOfDay; 


@end 
+0

Можете ли вы опубликовать полный код своего файла, чтобы мы могли лучше посмотреть, что происходит? – ophychius

+0

@ Ed F Я не вижу в коде какого-либо из методов делегата, необходимых для правильного внедрения NSURLConnection :) – self

+0

Я добавил полный файл –

ответ

3

-didRecieveData можно назвать несколько раз, как байты и комки приходят Вы должны переместить логику до -connectionDidFinishLoading. Это даст вам знать, когда соединение будет полностью выполнено, и данные готовы к анализу.

2

NSURLConnection является немного излишним, если вы просто делаете простой запрос GET (и вы разрабатываете версию iOS, которая поддерживает блоки). Вы можете сделать это в dispatch_async блоке:

- (void) getData 
{ 
    dispatch_async(<some_queue>, ^{ 

     NSError * error = nil; 
     NSString * response = [NSString stringWithContentsOfURL: stringWithContentsOfURL: requestUrl error: &error]; 

     // process JSON 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      // Update UI on main thread 

     } 

    }); 
} 

Как вы можете видеть из моего примера кода, вы также можете выполнить вашу обработку JSON на фоне очереди (при условии, метод вы звоните потокобезопасен). Просто перейдите в основную очередь, чтобы обновить интерфейс.

+0

Кажется, что даже когда я делаю это, моя строка JSON не помещается в массив. массив всегда пуст. –

+0

Звучит так, как будто ваша строка JSON недействительна. Попробуйте вставить его в http://jsonlint.com/, чтобы проверить это. –

+0

Я пошел на сайт и вошел в него и получил «действительный JSON» за результат. Это сводит меня с ума ... {"d": "[{\" id \ ": 1.0, \" Category \ ": 1, \" hPlan \ ": 0.0, \" Tip \ ": \" Требуется 3500 калорий, чтобы получить фунт. Если вы хотите потерять фунт в неделю, уменьшите потребление калорий на 250 калорий и включите ежедневную физическую активность, которая сгорит 250 калорий. \ ", \ TipDate \": \ "2012-05-12T00: 00: 00 \" \ "TimeStamp \": \ "AAAAAAAAB9I = \"}] "} –

3

Вы используете только один из методов NSURLConnectionDelegate. Попробуйте добавить это

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    //set up *receivedMutableString as instance variable in .h 
    if (!receivedMutableString) { 
     self.receivedMutableString = [[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    } else { 
     NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     [receivedMutableString appendString:dataString]; 
    } 
} 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    //Now receivedMutableString contains all json data 
    ...continue with your code 
} 
0

Похоже, что проблема не имеет ничего общего с получением веб-сервиса. Я должен был определить свой массив как __strong. Спасибо за помощь. У меня были некоторые хорошие идеи о том, как делать что-то лучше.

Смежные вопросы