2012-07-11 17 views
6

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:

  1. User1 wysłać Image1 -> wszystko wygląda ok, widzę postęp przesyłania.
  2. Użytkownik1 następnie wyślij zdjęcie2 -> nadal wygląda dobrze, widzę postęp przesyłania obu obrazów
  3. obraz1 przesyłanie zostało zakończone -> użytkownik2 otrzymuje uszkodzony obraz, który wygląda jak połączenie obrazów1 i obrazu2 razem!
  4. 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
enter image description here

zdjęcie2
enter image description here

uszkodzony obraz
enter image description here

+0

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

+0

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

+0

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

Odpowiedz

1

Użyj multipartFormRequest dla tego zastosowania poniższej metody:

- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method 
               path:(NSString *)path 
             parameters:(NSDictionary *)parameters 
          constructingBodyWithBlock:(void (^)(id <AFMultipartFormDataProxy>formData))block; 

Na przykład tak:

NSURLRequest* request = [[YourHTTPClient sharedHTTPClient] multipartFormRequestWithMethod:@"POST" 
        path:path 
        parameters:dict 
        constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
          [formData appendPartWithFileData:data1 
                 name:@"image1" 
                 fileName:@"image1.jpg" 
                 mimeType:@"image/jpeg"]; 
          [formData appendPartWithFileData:data2 
                 name:@"image2" 
                 fileName:@"image2.jpg" 
                 mimeType:@"image/jpeg"]; 
        } 
       }]; 
+0

Ale używam multipartFormRequestWithMethod, nie chcę wysyłać dwóch obrazów w jednym żądaniu, obrazy są wysyłane w dwóch osobnych żądaniach ... – Eyal

1

Jak się tworzenie obiektów UIImage że przejść do metody sendImageMsgWithPath: Czy tworzysz je za pomocą imageWithData: (lub podobnego)? Jeśli tak, widziałem takie problemy podczas próby ponownego użycia NSMutableData. Wygląda na to, że nawet po utworzeniu UIImage podsystem nadal musi czytać te dane w późniejszym czasie. A jeśli ponownie użyłeś NSMutableData, obraz zostanie uszkodzony.

W takim przypadku zaleca się użycie nowych NSMutableData do utworzenia każdej jednostki UII.

+0

Nie Otrzymuję obraz z UIImagePickerController ... – Eyal

Powiązane problemy