2016-11-03 7 views
0

次のコードは、Parse.comの配列をループしてローカルデータストアからサーバーにアップロードします。もちろんここでの問題は、成功したエントリごとにUIAlertViewを作成することです...これは非常に厄介なものになります。エラーがなければ表示されるが、ループの最後には1回だけ行うように変更するにはどうすればよいですか?Forループの終了時にUIAlertViewを表示...エラーがない場合

-(void)uploadToParse { 

    int i; 
    for (i = 0; i < [self.objects count]; i++) { 
     PFObject *entry = [self.objects objectAtIndex:i]; 


    NSString *imageFileName = [entry[@"FamilyName"] stringByAppendingString:@".png"]; 
    NSLog(@"%@", imageFileName); 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:imageFileName]; 
    UIImage *newImage = [UIImage imageWithContentsOfFile:filePath]; 
    NSData* data = UIImagePNGRepresentation(newImage); 


    PFFile *imageFile = [PFFile fileWithName:@"Locationimage.png" data:data]; 

    [entry setObject:imageFile forKey:@"HousePicture"]; 


    [entry saveInBackgroundWithBlock:^(BOOL succeeded, NSError * _Nullable error) { 
     if (!error) { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Upload Complete" message:@"Successfully added your Bible Distribution data." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
      [alert show]; 


      [entry unpinInBackgroundWithName:@"Share" block:^(BOOL succeeded, NSError * _Nullable error) { 

      }]; 

     } 
    }]; 


    [entry unpinInBackgroundWithName:@"Share" block:^(BOOL succeeded, NSError * _Nullable error) { 
     [self loadObjects]; 
    }]; 

    } 
} 

答えて

1

dispatch_groupをお勧めします。それらはタスクをキューに入れることを可能にし、各タスクが完了した後でのみ補完ハンドラが呼び出されます。

これは動作するはずです:アップロードが非同期であるため、

-(void)uploadToParse { 

    dispatch_group_t uploadGroup = dispatch_group_create(); 
    int i; 
    for (i = 0; i < [self.objects count]; i++) { 

     dispatch_group_enter(uploadGroup); 
     // ... Your code that sets up the upload task 


     [entry saveInBackgroundWithBlock:^(BOOL succeeded, NSError * _Nullable error) { 
      dispatch_group_leave(uploadGroup); 
     }]; 
    } 

    dispatch_group_notify(uploadGroup, dispatch_get_main_queue(),^{ 
     // This gets called after each task completes. 
     // Add code to show alert view here. 
    }); 
} 
+0

完璧、まさに私が必要としていたものです。 – user717452

0

アップデート - 私は重要な詳細情報が欠落しておく今朝ようです。 forループの内部では非同期処理が行われているため、明らかに機能しません。

したがって、の約束はこの状況に対処するためのきれいな方法を提供し、ios(promisekitなど)で使用できる約束があります。

ループの各反復では、アップロード操作の約束事が定義されます。これらの個々の約束のすべてから複合的な約束を作ります。化合物の約束が成就すれば、アラートを表示します。

+0

私はこの作品とは思いません。 – AdamPro13

+0

私は素早くスキミングコードブロックをする必要があります:)最高の賭けはおそらく約束(promisekitのようなもの)を使用することです –

関連する問題