Połączenia pętlowe i asynchroniczne w celu-c
Mam tablicę nazw tabel i chcę przechodzić przez nie, pobrać ich nazwy i dodać URL, aby utworzyć połączenie z usługą internetową w celu pobrania danych JSON. Pętla wydaje się działać na początku, każda z trzech nazw tabel w tablicy jest pobierana i używana do tworzenia połączenia z usługą internetową, a dane są pobierane, ale po zakończeniu pętli (od 3 do 0) Pojawia się pętla uruchomić ponownie i zapętlić nieskończenie dwie ostatnie tabele w tablicy.
Rejestruj dziennik (zwróć uwagę, że mówca i wystawca powtarzają się wielokrotnie):
2013-12-16 10:38:08.755 WebServiceTest[501:60b] loopCount = 3
2013-12-16 10:38:08.758 WebServiceTest[501:60b] table name = workshop
2013-12-16 10:38:08.817 WebServiceTest[501:60b] LoopCount is: 2
2013-12-16 10:38:08.821 WebServiceTest[501:60b] loopCount = 2
2013-12-16 10:38:08.822 WebServiceTest[501:60b] table name = exhibitor
2013-12-16 10:38:08.827 WebServiceTest[501:60b] LoopCount is: 1
2013-12-16 10:38:08.830 WebServiceTest[501:60b] loopCount = 1
2013-12-16 10:38:08.831 WebServiceTest[501:60b] table name = speaker
2013-12-16 10:38:08.835 WebServiceTest[501:60b] LoopCount is: 0
2013-12-16 10:38:09.199 WebServiceTest[501:3707] Status code = 200
2013-12-16 10:38:09.204 WebServiceTest[501:3707] Objects in current table - speaker = 1
2013-12-16 10:38:09.207 WebServiceTest[501:3707] Status code = 200
2013-12-16 10:38:09.210 WebServiceTest[501:3707] Objects in current table - exhibitor = 2
2013-12-16 10:38:09.229 WebServiceTest[501:450b] Status code = 200
2013-12-16 10:38:09.234 WebServiceTest[501:450b] Objects in current table - speaker = 1
2013-12-16 10:38:09.240 WebServiceTest[501:3707] Status code = 200
2013-12-16 10:38:09.244 WebServiceTest[501:3707] Objects in current table - exhibitor = 2
2013-12-16 10:38:09.271 WebServiceTest[501:450b] Status code = 200
2013-12-16 10:38:09.274 WebServiceTest[501:450b] Objects in current table - speaker = 1
2013-12-16 10:38:09.294 WebServiceTest[501:450b] Status code = 200
2013-12-16 10:38:09.298 WebServiceTest[501:4803] Status code = 200
2013-12-16 10:38:09.302 WebServiceTest[501:4803] Objects in current table - exhibitor = 2
2013-12-16 10:38:09.309 WebServiceTest[501:4803] Status code = 200
2013-12-16 10:38:09.337 WebServiceTest[501:4803] Objects in current table - speaker = 1
2013-12-16 10:38:09.338 WebServiceTest[501:4803] Status code = 200
2013-12-16 10:38:09.341 WebServiceTest[501:4803] Objects in current table - exhibitor = 2
2013-12-16 10:38:09.347 WebServiceTest[501:4803] Status code = 200
2013-12-16 10:38:09.352 WebServiceTest[501:4803] Objects in current table - speaker = 1
2013-12-16 10:38:09.311 WebServiceTest[501:450b] Objects in current table - workshop = 143
viewController.h:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<UITableViewDataSource, UITableViewDelegate, NSURLConnectionDataDelegate>{
NSMutableArray *arrayTable;
}
@property (weak, nonatomic) IBOutlet UITableView *myTableView;
@property NSMutableArray *tables;
@property NSMutableArray *tableNames;
@property NSMutableURLRequest *request;
@property NSString *tableName;
-(void) startUpdate;
typedef void(^completion_t)(NSArray* objects, NSError*error);
-(void)fetchData:(NSString *)tableName
withCompletion:(completion_t)completionHandler;
-(void)fetchObjectsWithTableName:(NSString*)tableName
completion:(completion_t)completionHandler;
viewController.m:
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad
{
[self startUpdate];
[super viewDidLoad];
[[self myTableView]setDelegate:self];
[[self myTableView]setDataSource:self];
arrayTable =[[NSMutableArray alloc]init];
}
-(void)startUpdate
{
NSArray* tableNames = @[@"speaker", @"exhibitor", @"workshop"];
NSUInteger loopCount = tableNames.count;
while (loopCount > 0){
NSString *tableName = [tableNames objectAtIndex:loopCount -1];
NSLog(@"loopCount = %lu", (unsigned long)loopCount);
NSLog(@"table name = %@", tableName);
[self fetchObjectsWithTableName:[tableName mutableCopy] completion:^(NSArray* objects, NSError*error){
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"Result: %@", objects);
}
}];
loopCount --;
NSLog(@"LoopCount is: %i", loopCount);
}
}
-(void)fetchObjectsWithTableName:(NSString*)tableName
completion:(completion_t)completionHandler;
{
[self fetchData:tableName withCompletion:^(NSArray* objects, NSError*error){
if (objects) {
[self.tables addObject:objects];
[self fetchObjectsWithTableName:tableName completion:completionHandler];
}
else if (objects == nil){
NSLog(@"objects = %@", objects);
NSLog(@"break out of FOWTN");
} else {
NSLog(@"Objects is something else...");
}
}];
if (completionHandler) {
completionHandler(self.tables, nil);
}
}
-(void)fetchData:(NSString *)tableName
withCompletion:(completion_t)completionHandler
{
NSString *currentURL = [NSString stringWithFormat:@"https://testapi.someURL.com/api/congress/%@", tableName];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:currentURL]];
[request addValue:@"application/json" forHTTPHeaderField:(@"Accept")];
[NSURLConnection sendAsynchronousRequest:request
queue:[[NSOperationQueue alloc] init]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
NSError* err = error;
NSArray* objects; // final result array as a representation of JSON Array
if (response) {
NSHTTPURLResponse *newResp = (NSHTTPURLResponse*)response;
if (newResp.statusCode == 200) {
NSLog(@"Status code = %li", (long)newResp.statusCode);
if ([data length] >0 && error == nil)
{
NSError* localError;
objects = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (objects) {
if (completionHandler) {
completionHandler(objects, nil);
}
//NSLog(@"Objects in current table - %@ = %@", tableName, objects);
NSLog(@"Objects in current table - %@ = %lu", tableName, (unsigned long)objects.count);
return;
} else {
err = localError;
}
} else {
// err = ...
}
}
}
if (objects == nil) {
NSLog(@"Nothing found in table: %@", tableName);
//assert(err);
if (completionHandler) {
completionHandler(nil, err);
}
}
}];
}