У меня есть скрипт на 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
экземпляр объекта NSMutableData
, в didReceiveData
, вы должны просто добавить полученные данные к этому NSMutableData
, а затем в connectionDidFinishLoading
, как только вы объедините все данные, полученные в нескольких вызовах didReceiveData
в одну NSMutableData
, теперь вы можете взять эту окончательную NSMutableData
и попытаться преобразовать ее в UIImage
.
BTW, только 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);
}
}
}
Вы можете посмотреть, как эта транзакция происходит с использованием Чарльза, и убедитесь, что это изображение в ответ и т.д.
NSMutableData
, создав NSMutableData
экземпляр в [NSMutableData data]
перед началом подключения, didReceiveData
просто didReceiveData
полученные данные в NSMutableData
, и преобразовав их только в UIImage
в connectionDidFinishLoading
.
data
вdidReceiveData
действительно изображение? PHP отвечает с типом содержимого изображения?