我正在 iOS7 中实现一个应用程序,它是一种社交网络应用程序,其中包含带有图像的帖子和保存从客户端发送的所有数据的后端。 iOS客户端通过json发送帖子信息,发送信息后,它开始使用多部分形式发送图像AFNetworking
.
发送图像时需要通知我,以便我可以使用新帖子(包括客户最近发布的帖子)刷新应用程序的主视图。在实践中,如果我向后端请求最后的帖子并且多部分尚未完成,则图像的发送会被中断并且无法发送图像。
后端开发于WCF
是一个 RESTful JSON Web 服务。
以下是将帖子发送到后端的方法:
+(void)addPostToServerAddtext:(NSString *)text addimage:(UIImage *)image addbeach:(NSString *)beach location:(NSString*)location;
{
NSLog(@"entro a addPost");
NSString *urlBackend = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"URLBackend"];
NSData* dataImage = UIImageJPEGRepresentation(image, 1.0);
NSString* ImageName = [NSString stringWithFormat:@"%@_%@.jpg",idUser ,dateToServer];
NSString *jsonRequest = [NSString stringWithFormat:@"{\"Date\":\"%@\"...."];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@newPost",urlBackend]];
NSMutableURLRequest *request = [ [NSMutableURLRequest alloc] initWithURL:url];
NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:requestData];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
if (image != nil) {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:[NSString stringWithFormat:@"%@FileUpload",urlBackend]
parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:dataImage name:@"image" fileName:ImageName mimeType:@"image/jpg" ];
}
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", responseObject);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
}
有几点想法:
-
You say:
iOS 客户端通过 json 发送帖子信息,发送信息后,它开始使用 AFNetworking 通过多部分形式发送图像。
从技术上讲,您不是在等待信息发送,而是同时执行这些操作。您希望这些同时进行吗?还是顺序的?或者为什么不只是发布信息和图像的单个请求?
-
我建议对这两个请求使用 AFNetworking。你已经有了一个强大的框架来管理网络请求,看到毛茸茸的感觉很别扭NSURLConnection
代码在那里。
如果您保留NSURLConnection
代码在那里,请注意你这样做not想要start
a NSURLConnection
,除非你用过initWithRequest:delegate:startImmediately:
with NO
对于最后一个参数。您实际上启动了两次,这可能会导致问题。我建议删除start
call.
-
抛开所有这些,您要做的就是向您的方法添加一个完成块参数,例如:
+ (void)addPostToServerAddtext:(NSString *)text addimage:(UIImage *)image addbeach:(NSString *)beach location:(NSString*)location completion:(void (^)(id responseObject, NSError *error))completion
{
// ...
if (image != nil) {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:[NSString stringWithFormat:@"%@FileUpload",urlBackend] parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:dataImage name:@"image" fileName:ImageName mimeType:@"image/jpg" ];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (completion) completion(responseObject, nil);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (completion) completion(nil, error);
}];
}
}
然后你可以像这样调用它:
[Persistence addPostToServerAddtext:text addimage:image addbeach:nil location:annotation completion:^(id responseObject, NSError *error) {
if (error) {
// handle error
return
}
// otherwise use the responseObject
}];
现在,我不知道您想在完成块中返回哪些参数(我假设您想返回AFHTTPRequestOperationManager
做了),但只需更改参数即可completion
根据您的需要进行阻止。
-
与您原来的问题无关,但我注意到您正在构建jsonRequest
像这样:
NSString *jsonRequest = [NSString stringWithFormat:@"{\"Date\":\"%@\"...."];
如果这些字段中的任何一个包含用户提供的信息(例如,如果用户在提供的信息中使用双引号怎么办),那就有点冒险了。我建议你建立一个字典,然后建立jsonRequest
从那。它将更加坚固。因此:
NSDictionary *dictionary = @{@"Date" : date,
@"Message" : message};
NSError *error = nil;
NSData *request = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error];
if (error)
NSLog(@"%s: dataWithJSONObject error: %@", __FUNCTION__, error);
或者,如果您使用 AFNetworking,我相信它会为您完成字典的 JSON 转换。但是,最重要的是,在自己创建 JSON 字符串时要非常小心,至少在请求可能包含任何用户提供的信息时是如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)