У меня есть скрипт на PHP, который захватывает изображение на моем сервере. Я хочу, чтобы он мог отправить его в Objective-C. Я пробовал многочисленные методы, которые я нашел, чтобы вернуть изображение, и ни один из которых, кажется, не работает. У меня есть изображение, хранящееся на моем сервере в каталоге, и я хочу иметь возможность отправить его в мое приложение. Это мой текущий код:
Код просто не меняет изображение. Я не уверен, как проверить, правильно ли PHP отправляет изображение.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"myserverurl"]];
[request setHTTPMethod:@"POST"];
NSString *body = @"username=benr783&password=testpassword";
[request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *connect = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connect start];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
self.image.image = [UIImage imageWithData:data];
}
Пара наблюдений:
Похоже, вы предполагаете, что получите одно изображение целиком за один раз. didReceiveData
метод. Это неверное предположение. (На самом деле, если ваши изображения не слишком малы, это на самом деле маловероятно.)
Прежде чем начать подключение, создайте экземпляр NSMutableData
объект, в didReceiveData
, вы должны просто добавить полученные данные к этому NSMutableData
а затем в connectionDidFinishLoading
после объединения всех данных, полученных в ходе нескольких вызовов didReceiveData
в один NSMutableData
Теперь вы можете взять этот финал NSMutableData
и попытаться преобразовать его в UIImage
,
Кстати, только звонок start
если вы используете исполнение initWithRequest
с startImmediately
вариант и с этим параметром, установленным на NO
(который вы используете только в особых обстоятельствах). В этом случае просто удалите это start
вызов.
Вы должны проверить, действительно ли полученные данные являются изображением. Например, в didReceiveResponse
убедитесь, что NSURLResponse
имеет statusCode
из 200. Убедитесь, что didFailWithError
не был назван. И т.п.
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
int statusCode = [(NSHTTPURLResponse *)response statusCode];
if (statusCode != 200) {
NSLog(@"statusCode != 200; it is %ld", (long)statusCode);
}
}
}
Возможно, вы захотите наблюдать за этой транзакцией, используя Чарльз и убедитесь, что это изображение в ответ и т. д.
Других решений пока нет …