канонический способ прочитать plist из URL в NSDictionary? Как контролировать время ожидания? - PullRequest
1 голос
/ 13 июня 2009

У меня есть сервлет, который обслуживает XML-файл plist. Какой лучший способ сделать это в NSDictionary? У меня это в основном работает с:

NSDictionary* dict = [ [ NSDictionary alloc] initWithContentsOfURL:
                     [NSURL URLWithString: @"http://example.com/blah"] ];

Но тогда я не могу контролировать время ожидания; Я бы предпочел, чтобы мой пользовательский интерфейс не зависал в течение 60 секунд только из-за того, что сервер (которым я не могу управлять) имеет шипение. Я знаю о NSURLRequest, что позволит мне сделать следующее:

NSURLRequest *theRequest=[NSURLRequest requestWithURL:
         [NSURL URLWithString: @"http://example.com/blah"
                  cachePolicy:NSURLRequestUseProtocolCachePolicy
             timeoutInterval:5 ];

Но я не совсем понимаю, как передать это NSDictionary.

1 Ответ

5 голосов
/ 14 июня 2009

Вы должны сделать это, используя асинхронные методы. Начните с этого ответа / сообщения:

Могу ли я сделать POST или GET-запросы из приложения iphone?

Это даст вам ваши данные и поместит их в переменную: responseData. Теперь вам нужно добавить свой код, чтобы преобразовать его в NSDictionary следующим способом:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

Я нашел 2 возможных способа конвертировать NSData в NSDictionary. Этот путь прямо из Apple Руководство по архивам и сериализации .

NSString *errorStr = nil;
NSPropertyListFormat format; 

NSDictionary *dictionary = [NSPropertyListSerialization propertyListFromData: responseData
                mutabilityOption: NSPropertyListImmutable
                format: &format
                errorDescription: &errorStr];

Во-вторых:

NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSDictionary *dictionary = [string propertyList];
[string release];
...