2012-02-27 3 views
0

Я хочу, чтобы загрузить данные в формате JSON через многопоточность и разобрать его NSDictionary, сделали это ранее с помощью TWRequest класс для твиттер-каналы, Как я могу использовать NSURLRequest сделать то же самое, как:Использование многопоточности для данных в формате JSON загрузки

TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString: @"https://api.twitter.com/1/statuses/public_timeline.json?screen_name=firdous_ali86&include_entities=true"] parameters:nil requestMethod:TWRequestMethodGET]; 

    // Notice this is a block, it is the handler to process the response 
    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) 
    { 
     if ([urlResponse statusCode] == 200) 
     { 
      tweetCollection = [[NSMutableArray alloc] init]; 
      Tweet *tweet; 
      NSError *error; 

      NSArray *dict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; 
     } 
    }]; 

Проблема заключается в том, что NSURLRequest не реализует метод performRequestWithHandler.

ответ

0

я использовал:

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1 
#define kLatestKivaLoansURL [NSURL URLWithString: @"http://my_service_url"] //2 

- (void)viewDidLoad 
{ 
    myCollection = [[NSMutableArray alloc] init]; 

    [super viewDidLoad]; 

    dispatch_async(kBgQueue, ^{ 
     NSData* data = [NSData dataWithContentsOfURL: 
         kLatestKivaLoansURL]; 
     NSError* error; 
     NSDictionary* jsonDict = [NSJSONSerialization 
            JSONObjectWithData:data //1 
            options:kNilOptions 
            error:&error]; 

     NSArray* myArray = [jsonDict objectForKey:@"response"]; //2 

     NSEnumerator *myIterator = [myArray objectEnumerator]; 
     id anObject; 

     Cast *cast; 

     while(anObject = [myIterator nextObject]) 
     { 
      cast = [[Cast alloc] init];  
      cast.castTitle = [anObject objectForKey:@"castTitle"]; 

      [myCollection addObject:cast]; 
     } 
     [myTableView reloadData]; 
    }); 
} 
+1

Я думаю, что вы должны вызвать метод tableload reloadData из основного потока. В документации по яблоку вы можете найти это: Примечание. По большей части классы UIKit должны использоваться только из основного потока приложения. Это особенно справедливо для классов, полученных из UIResponder, или для управления пользовательским интерфейсом вашего приложения. Для получения дополнительной информации см. Https://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIKit_Framework/Introduction/Introduction.html. – Julien

-1

Вот мой самый популярный ответ недели. Посмотрите на документы Apple. https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html#//apple_ref/doc/uid/10000165i

Ответ правильный.

Кто-нибудь действительно читает документацию перед тем, как перейти к переполнению стека?

+0

я не см. блоки, используемые там, и никакой альтернативы использованию метода executeRequestWithHandler – Firdous

1

Вы всегда можете создать делегат и позволить этому делегату перезвонить после завершения, или использовать соединение, завершив загрузку метода делегирования NSURLConnection, чтобы обработать ответ twitter. Или лучшая идея заключается в использовании ASIHTTPRequest или AFNetwork рамки, чтобы сделать запрос асинхр, а затем сделать JSON разбор

1

Вы можете использовать NSURLConnection с помощью метода:

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler