Zajmuję się tworzeniem aplikacji do obsługi wiadomości, a użytkownicy mogą wysyłać do siebie zdjęcia.
Gdy użytkownik wysyła więcej niż jeden obraz wyślę je równolegle (nie czekać na pierwszy aby zakończyć przesyłanie zanim wyślę drugi)Wysyłanie więcej niż jednego obrazu za pomocą AFNetworking
Przed przejściem do AFNetworking
udało mi się w ten sposób z ASIFormDataRequest
, a nawet jeśli wysłałem 2 obrazy, oba zostały przesłane równolegle i pomyślnie dostarczone do drugiego użytkownika.
Kiedy próbuję to zrobić z AFNetworking, dostaję dziwne zachowanie.
Postaram się opisać sprawę byli user1 wysłać dwa obrazy zbyt użytkownik2:
- User1 wysłać Image1 -> wszystko wygląda ok, widzę postęp przesyłania.
- Użytkownik1 następnie wyślij zdjęcie2 -> nadal wygląda dobrze, widzę postęp przesyłania obu obrazów
- obraz1 przesyłanie zostało zakończone -> użytkownik2 otrzymuje uszkodzony obraz, który wygląda jak połączenie obrazów1 i obrazu2 razem!
- image2 przesyłanie jest zakończone -> użytkownik2 dostaje Image2 powodzeniem
ten sposób mogę wysłać obrazu
- (void)sendImageMsgWithPath:(NSString *)path
image:(UIImage *)image
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
progress:(void (^)(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress
{
NSData *imageData = UIImageJPEGRepresentation(image, 0.5);
// create the request
NSURLRequest *request = [[AppClient sharedClient] multipartFormRequestWithMethod:@"POST" path:path parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
{
[formData appendPartWithFileData:imageData name:@"image_name" fileName:@"image_name.jpg" mimeType:@"image/jpeg"];
}];
// create the operation
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
// set progress block
[operation setUploadProgressBlock:progress];
//set completion blocks
[operation setCompletionBlockWithSuccess:success failure:failure];
// set it to work in background
[operation setShouldExecuteAsBackgroundTaskWithExpirationHandler:nil];
// add it to the operations queue
[[AppClient sharedClient] enqueueHTTPRequestOperation:operation];
}
*** ścieżka zarówno dla przesyłania obrazów jest taka sama:
ścieżka = @ "FrontEnd? Cmd = sendimage & fromuserid = 3 & touserid = 1 &"
zostanie ona dodana do baseURL stworzyć URL coplete:
@ "http://somename.myftp.org:8080/web_proj/FrontEnd?cmd=sendimage&fromuserid=3&touserid=1"
To są obrazy I wysłania:
Image1
zdjęcie2
uszkodzony obraz
upewnij się, że używasz osobnych buforów dla każdego wysyłanego obrazu. Upewnij się również, że odbiornik używa oddzielnych buforów dla każdego odebranego obrazu. Wygląda na to, że są gdzieś łączone. Wreszcie, jeśli wysyłasz/odbierasz przez 3G/4G, możesz nie uzyskać większej przepustowości poprzez wysyłanie wszystkich obrazów równolegle. Będziesz musiał eksperymentować, aby zobaczyć, ile strumieni jest optymalnych. – nielsbot
Udaje mi się to zrobić z biblioteką ASIHTTPRequest, więc prawdopodobnie nie jest to problem z serwerem. O buforach po stronie klienta, cóż, tak naprawdę nie radzę sobie z tym, używam tylko API AFNetworking, nie wiem, czy biblioteka to zarządza, czy też muszę to zrobić ... – Eyal
Jak sobie z tym radzisz? po stronie serwera? Może piszesz otrzymane obrazy do tego samego pliku: pierwszy zaczyna być nadpisywany przez drugi, drugi jest wysyłany, ponieważ całkowicie nadpisał pierwszy. – yonosoytu