等待多部分图像发送完成

我正在iOS7中的一个应用程序,这是一种社交networking应用程序与图像的post和后端,保存所有客户端发送的数据。 iOS客户端通过json发送post信息,发送信息后,开始使用AFNetworking通过多部分forms发送图片。

我需要在图像发送时得到通知,以便我可以刷新应用程序的主视图,包括最近发布的新post。 在实践中,如果我要求后端的最后一个post,多部分还没有完成,图像的发送被中断,并不能发送图像。

后端是在WCF开发的,并且是一个RESTful JSON Web服务。

以下是将post发送到后端的方法:

 +(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); }]; } } 

一些想法:

  1. 你说:

    iOS客户端通过json发送post信息,发送信息后,开始使用AFNetworking通过多部分forms发送图片。

    从技术上讲,你不是在等待信息的发送,而是在同时做这些事情。 你想要这些是并发的吗? 还是顺序? 或者为什么不只是一个单一的要求,张贴的信息以及形象?

  2. 我build议使用AFNetworking这两个请求。 你有一个强大的pipe理networking请求的框架,看到毛茸茸的NSURLConnection代码在那里感觉很尴尬。

    如果你保留了NSURLConnection代码,注意你不想start NSURLConnection ,除非你使用了initWithRequest:delegate:startImmediately:对于最后一个参数使用NO 。 你有效地启动了两次,这可能会导致问题。 我build议删除start电话。

  3. 把所有这些设置在一边,你想要做的是给你的方法添加一个完成块参数,例如:

     + (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块的参数。

  4. 与您的原始问题无关,但我注意到您正在构buildjsonRequest如下所示:

     NSString *jsonRequest = [NSString stringWithFormat:@"{\"Date\":\"%@\"...."]; 

    如果这些字段中的任何一个包含用户提供的信息(例如,如果用户在所提供的信息中使用双引号),则这是有点冒险的。 我build议你build立一个字典,然后从那里build立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转换。 但是,底线,要非常小心自己创buildJSONstring,至less如果请求可能包含任何用户提供的信息。

Interesting Posts