2013-05-05 2 views
0

У меня возникли проблемы с эмуляцией архитектуры MVC при выполнении запроса JSON.Эмуляция архитектуры MVC с запросом JSON

Ниже я получаю данные асинхронно, создавая отдельный класс NSObject для обработки запроса.

Это сказало, что я в тупике относительно того, что я должен использовать в методе запросов ниже в TableViewController.

TableViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //refactoring with MVC 
    self.aQueue = [[[NSOperationQueue alloc] init] autorelease]; 
    self.storeLogos = [NSMutableDictionary dictionary]; 

    [self queryStoreData]; 

} 
    -(void)queryStoreData 
{ 
    aStoreQuery = [StoreQuery queryForStores:self]; 
} 


-(void)query:(StoreQuery *)query queryResult:(id)object 
     { 
      [self.aQueue addOperationWithBlock:^{ 

       //JSONKit? 




      } 

     } 

StoreQuery.m

@synthesize myConnection, myRequest, storeData; 

+(StoreQuery*)queryForStores:(id<StoreQueryDelegate>)aDelegate 
{ 
    StoreQuery *storeQuery = [[[StoreQuery alloc] init] autorelease]; 
    storeQuery.delegate = aDelegate; 
    storeQuery.myRequest = [NSURLRequest requestWithURL:@"URL"]; 
    storeQuery.myConnection = [NSURLConnection connectionWithRequest:storeQuery.myRequest delegate:storeQuery]; 
    storeQuery.storeData = [[NSMutableArray data] retain]; 
    return storeQuery; 

} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [self.storeData setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [self.storeData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection 
    didFailWithError:(NSError *)error 
{ 
    NSLog(@"Connection Error: %@",[error localizedDescription]); 
    if (self.delegate) { 
     [self.delegate request:self didFailWithError:error]; 
    } 

} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    if (self.delegate) { 
     [_delegate request:self didFinishWithObject:self.storeData]; 
    } 
} 


- (void)dealloc 
{ 
    [myRequest release]; 
    [myConnection release]; 
    [storeData release]; 
    [super dealloc]; 
} 

ответ

1

я был бы склонен ликвидировать весь StoryQuery класс (вы, кажется, не очень нужен какой-либо из NSURLConnectionDataDelegate методов здесь) и просто использовать сетевой вызов на основе блока, используя либо стандартный NSURLConnection или прекрасный AFNetworking рамки ,

Стандартная NSURLConnection техника:

-(void)queryStoreData 
{ 
    NSURL *url = [NSURL URLWithString:@"yoururl"]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [NSURLConnection sendAsynchronousRequest:request 
             queue:self.aQueue 
          completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

           if (error) 
           { 
            NSLog(@"%s: error retrieving data = %@", __FUNCTION__, error); 
            return; 
           } 

           // now parse the results, e.g., if it was JSON: 

           NSError *parseError = nil; 
           self.results = [NSJSONSerialization JSONObjectWithData:data 
                       options:0 
                       error:&parseError]; 
           if (parseError) 
           { 
            NSLog(@"%s: error parsing data = %@", __FUNCTION__, parseError); 
            return; 
           } 

           // note, all user interface updates must happen on main queue, e.g. 

           [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
            [self.tableView reloadData]; 
           }]; 
          }]; 
} 

Или с помощью AFNetworking:

-(void)queryStoreData 
{ 
    NSURL *url = [NSURL URLWithString:@"yoururl"]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^ 
             (NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
     self.results = JSON; 
     [self.tableView reloadData]; 
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
     NSLog(@"JSON network request failed: %@", error); 
    }]; 
    [operation start]; 
} 
+0

Кстати, пока я пытался представить реальные примеры того, как вы можете это сделать, ваш вопрос ссылается на использование «архитектуры MVC». Соединение между созданием сетевого запроса и правильной архитектурой модели-представления-контроллера является тонким. Но если вы действительно были обеспокоены надлежащей архитектурой MVC, вы, вероятно, не сделали бы массив результатов членом объекта контроллера, но на самом деле вы могли бы использовать некоторый объект модели. Но я предполагаю, что реальный вопрос заключается в том, как выполнять работу в сети и использовать результаты, а не архитектуру MVC. – Rob

0

Лучший пример для MVC архитектурно является AFNetworking Example. Выполнено с использованием Blocks.

+0

ответ должен быть больше, чем просто ссылку, вы должны дать описание того, что охватывает связь, так что ответ будет стоять без ссылки – Mark

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