2

以下は、plistファイルから読み取ったバックグラウンドスレッドでビデオをアップロードするための私の方法です。

今私が必要としているのは、彼らがplistからすべてのエントリを読み取り、最初のブロックの実行を完了したら、新しいエントリがplistファイルに入っているかどうかを完了ブロックでチェックしたい..そしてstartThreadForUpload、数時間後に呼び出すだけではない場合.どうすればそれを行うことができますか?今、完了ブロックで同じメソッドを呼び出すだけなので、実行を続けます...

-(void)startThreadForUpload{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        assetManager =[AssetManager sharedInstance];
        NSDictionary *videoListDict=  [assetManager getAllVideoFromPlist];
        NSArray *videoListKeyArray=[videoListDict allKeys];

        if(videoListKeyArray.count!=0)
            {

            for(NSString *key in videoListKeyArray){
                NSData *videoData = [videoListDict objectForKey:key];
                Video *vidObject = (Video *)[NSKeyedUnarchiver unarchiveObjectWithData:videoData];

             amazonManger=[AmazonManager sharedInstance];

                [amazonManger uploadVideoWithVideoName:vidObject.videoName IsImage:NO VideoObject:vidObject];
                [amazonManger uploadVideoWithVideoName:vidObject.thumbImageName IsImage:YES VideoObject:vidObject];

            }


        }
        dispatch_async(dispatch_get_main_queue(), ^(void) {

            //Stop your activity indicator or anything else with the GUI
            //Code here is run on the main thread

            [self startThreadForUpload];
            // WARNING! - Don't update user interfaces from a background thread.

        });
    });

}
4

1 に答える 1

1

plist を新しい変更可能な辞書に再度読み込んでから、既に処理したキーのオブジェクトを削除して、プロセスを繰り返してみませんか。

実際のアップロード機能を新しいメソッドにリファクタリングして、すべての動画がアップロードされるまで再帰的に呼び出すことができるようにする必要があります。その後、遅延の後、またはdispatch_afterを使用して、元のセレクターを再度実行できます。

for ループを呼び出して新しいメソッドにリファクタリングし、次のuploadVideos:ように呼び出します。

- (void)startThreadForUpload
{
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    assetManager = [AssetManager sharedInstance];
    NSDictionary *videoListDict = [assetManager allVideoFromPlist];

    // call the new method defined below to upload all videos from plist
    [self uploadVideos:videoListDict.allValues];

    // create a mutable dictionary and remove the videos that have already been uploaded
    NSMutableDictionary *newVideoListDict = [assetManager getAllVideoFromPlist].mutableCopy;
    [newVideoListDict removeObjectsForKeys:videoListDict.allKeys];

    if (newVideoListDict.count > 0) {
      // new videos, so upload them immediately
      [self uploadVideos:newVideoListDict.allValues];
    }

    // start another upload after 300 seconds (5 minutes)
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(300 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
      [self startThreadForUpload];
    });
  });
}

- (void)uploadVideos:(NSArray *)videos
{
  AmazonManager *amazonManger = [AmazonManager sharedInstance];

  for (NSData *videoData in videos) {
    Video *vidObject = (Video *)[NSKeyedUnarchiver unarchiveObjectWithData:videoData];

    // call a method defined in a category, described below
    [amazonManager uploadVideo:vidObject];
  }
}

懸念事項を適切に分離するために、AmazonManager でカテゴリを定義する必要があります。

// put this in AmazonManager+VideoUpload.h
@interface AmazonManager (VideoUpload)
- (void)uploadVideo:(Video *)video;
@end

// put this in AmazonManager+VideoUpload.m
@implementation AmazonManager (VideoUpload)

- (void)uploadVideo:(Video *)video
{
  [self uploadVideoWithVideoName:video.videoName IsImage:NO VideoObject:video];
  [self uploadVideoWithVideoName:video.thumbImageName IsImage:YES VideoObject:video];
}

@end

問題は、メソッドが呼び出されるたびにstartThreadForUpload、plist ファイルからすべてのビデオをアップロードすることです。アップロードする必要のある動画を常にこのように読みたい場合は、アップロード済みの動画を保存して、2 回アップロードするのを避ける必要があります。

それが役立つことを願っています:)

于 2014-06-06T07:18:07.200 に答える