Прежде всего, вопросы очень просты ... если вы просто хотите увидеть, что они собой представляют, пропустите этот пост в конце этого поста, и вы см. их жирным шрифтом .. для более подробной информации вы можете прочитать оставшуюся часть этого поста ...
Я просто пытаюсь сгладить мое NSURLConnection, чтобы оно работало плавно, и я правильно это понимаю. Существует глубокая нехватка примеров / руководств по асинхронным соединениям в Интернете или не хватает каких-либо, которые я могу найти, которые объясняют, что происходит, с любым уровнем глубины, кроме запуска и запуска соединения, которое после работы над ним кажется довольно простым. Надеюсь, этот вопрос может заполнить пустоту, которая, как мне кажется, существует для других пользователей.
Итак, в моем .h файле я импортировал заголовки Foundation и объявил методы, необходимые для получения или отсутствия полученных данных (ошибок и т. Д.).
.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h> //add foundations
//.. other headers can be imported here
@interface MyViewController: UITableViewController {
//Im not setting any delegates to access the methods because Is all happening in the same
//place so I just use the key word 'self' when accessing the methods declared below
//I'm not sure if this is the best thing to do but I wasn't able to get my head around declaring the delegate or how it would help me with the way I have set up my request etc.
}
- (IBAction)setRequestString:(NSString *)string; //this method sets the request and connection methods
//these methods receive the response from my async nsurlconnection
- (void)receivedData:(NSData *)data;
- (void)emptyReply;
- (void)timedOut;
- (void)downloadError:(NSError *)error;
Итак, это мой заголовочный файл ... довольно просто, не нужно много объяснений.
.m
//call setRequestString from some other method attached to a button click or something
[self setRequestString:@"rss.xml"];
//..
- (IBAction)setRequestString:(NSString *)string
{
//Set database address
NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http:www.comicbookresources/feeds/"]; // address not real jsut example
//append the string coming in to the end of the databaseURL
[databaseURL appendString:string];
//prepare NSURL with newly created string
NSURL *url = [NSURL URLWithString:databaseURL];
//AsynchronousRequest to grab the data
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
if ([data length] > 0 && error == nil){
[self receivedData:data];
}else if ([data length] == 0 && error == nil){
[self emptyReply];
}else if (error != nil && error.code == NSURLErrorTimedOut){ //used this NSURLErrorTimedOut from foundation error responses
[self timedOut];
}else if (error != nil){
[self downloadError:error];
}
}];
}
теперь настраивает методы, которые были инициализированы в файле .h и вызваны в операторе if выше
- (void)receivedData:(NSData *)data
{
NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", newStr); //logs recived data
//now you can see what data is coming in on your log
//do what you want with your data here (i.e. start parsing methods
}
- (void)emptyReply
{
//not sure what to do here yet?
}
- (void)timedOut
{
//also not sure what to do here yet?
}
- (void)downloadError:(NSError *)error
{
NSLog(@"%@", error);
UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"A connection failure occurred." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[errorAlert show];
}
Cool, так что в значительной степени основные принципы того, что я сделал прямо здесь ... теперь вопросы У меня следующие.
Вопрос первый: Где я вызываю NSURLConnection вот так
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
Что здесь происходит, что означает ^ для выполнения всего блока (включая операторы if) в другом потоке или что-то в этом роде? потому что это очень похоже на форматирование grand central dispatch, но немного по-другому.
Вопрос второй: что мне делать внутри методов emptyReply и timedOut ?
Вопрос третий: Как мне включить в это кеширование? Я хочу кэшировать ответы, которые я получаю на разные запросы. то есть с моим setRequestString вы увидите, что есть строковый входной параметр, поэтому я могу запрашивать разные RSS-каналы одним и тем же методом .. Мне нужно выяснить, как кэшировать эти ответы в отдельные кеши .. но я не уверен, с чего начать Это.
Наконец Если вы зашли так далеко, большое спасибо за то, что прочитали мой вопрос. Надеюсь, с вашими ответами мы сможем получить здесь довольно хорошее решение ... которое другие люди могут использовать для себя и выбирать те части и элементы, которые им нужны, которые работают для их собственного решения ...
В любом случае большое спасибо за чтение и я с нетерпением жду ваших ответов ... даже если это просто ссылки на руководства или примеры, которые, по вашему мнению, могут мне помочь ...все хорошо, я просто хочу полностью понять, что происходит, и какое решение является хорошим.