gpt4 book ai didi

ios - 等待多部分图像发送完成

转载 作者:行者123 更新时间:2023-11-29 12:59:42 24 4
gpt4 key购买 nike

我正在 iOS7 中实现一个应用程序,它是一种社交网络应用程序,带有带图像的帖子和一个保存从客户端发送的所有数据的后端。 iOS 客户端通过 json 发送帖子的信息,发送信息后,它开始使用 AFNetworking 通过多部分形式发送图像。

我需要在发送图像时收到通知,以便我可以使用新帖子刷新应用程序的主视图,包括客户最近发布的帖子。在实践中,如果我请求后端获取最后的帖子并且多部分尚未完成,则图像的发送会中断并且无法发送图像。

后端是在 WCF 中开发的,是一个 RESTful JSON 网络服务。

这是将帖子发送到后端的方法:

+(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. 你说:

    The iOS client is sending the information of the post via json and after the info is sent, it starts to send the image via multipart form using AFNetworking.

    从技术上讲,您并不是在等待信息发送,而是在同时进行这些操作。你想让这些并发吗?还是顺序的?或者为什么不只发布一个请求来发布信息和图像?

  2. 我建议对这两个请求都使用 AFNetworking。你已经有了一个强大的网络请求管理框架,但看到里面的毛茸茸的 NSURLConnection 代码感觉很尴尬。

    如果您保留 NSURLConnection 代码,请注意您想要启动 NSURLConnection ,除非您使用 initWithRequest:delegate:startImmediately:NO 作为最后一个参数。您实际上启动了两次,这可能会导致问题。我建议删除 start 调用。

  3. 抛开所有这些,您要做的是向您的方法添加一个完成 block 参数,例如:

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

    现在,我不知道你想在你的完成 block 中返回什么参数(我假设你想返回 AFHTTPRequestOperationManager 所做的),但只需更改参数 completion block 以满足您的需要。

  4. 与您原来的问题无关,但我注意到您正在构建 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 字符串时要非常小心,至少在请求可能包含任何用户提供的信息时。

关于ios - 等待多部分图像发送完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20124242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com