#ios #nsstring
#iOS #nsstring
Вопрос:
В приведенном ниже коде я ищу способ ограничить длину подключенной строки. Допустим, я хочу получить только первые 100 символов. Но я не хочу выполнять обработку, связанную после извлечения. Есть ли способ инициализировать NSString с определенной длиной?
NSError* error = nil;
NSString *connected = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.somesite.com"] encoding:NSASCIIStringEncoding error:amp;error];
Ответ №1:
Вам придется извлекать данные самостоятельно, а не использовать для этого удобный метод NSString. Если вы используете, скажем, NSURLConnection или ASIHTTPRequest, вы можете закрыть соединение, когда получите столько данных, сколько захотите.
Ответ №2:
Вы могли бы использовать методы NSString для извлечения первых 100 символов, но вы все равно потратили бы впустую пропускную способность, чтобы получить все данные. Итак, зачем загружать все, когда вам нужно всего 100 символов.
Итак, чтобы получить только часть данных, поступающих с сервера, вам нужно подсчитать поток данных, который выдает ответ url. Для этого вы могли бы использовать NSURLConnection
—
- (void)viewDidLoad {
[super viewDidLoad];
responseData = [[NSMutableData data] retain];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://someurl.com/data.json"]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[responseData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
if([responseData length] <= 100)
[responseData appendData:data];
else //break connection
[self connectionDidFinishLoading:connection];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
label.text = [NSString stringWithFormat:@"Connection failed: %@", [error description]];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
}
Итак, вам нужно ввести свою логику didReceiveData
. Здесь вам нужно только 100 символов, поэтому разорвите соединение после достижения этого числа.