2011-09-12 8 views
0

私は自分のAppDelegateに以下のメソッドを持っています。 updateViewでラベルを更新し、ASIHTTPRequest経由でアップロードを実行する方法を見つけることができません。以下のコードでは、アップロード(startUpload)は実行されますが、ラベル(updateLabel)は更新されません。 startUploadの呼び出しをコメントアウトすると、ラベルが更新されます。また、uploadViewController内にディスパッチキューを作成しようとしましたが、これは2つのメソッドのうちの1つしか動作させることができない同様の結果を持っていました。 UploadViewControllerでdispatch_asyncの使用に問題があり、同じコントローラで2つのファンクションコールを起動できません。

- (void) showProgressView:(NSString *)filePath { 
    NSView *view = [uploadViewController view]; 
    dispatch_queue_t queue = dispatch_get_global_queue(0,0); 
    dispatch_async(queue, ^{ 
     // assigns the upload view to the root NSPanel 
     [box setContentView:view]; 
    }); 
    dispatch_async(queue, ^{ 
     // starts the upload using ASIHTTPRequest 
     [uploadViewController startUpload:filePath]; 
    }); 
    dispatch_async(queue, ^{ 
     // updates a label in the upload view 
     [uploadViewController updateLabel]; 
    }); 
} 

-(void)startUpload:(NSString *)filePath { 
    HandZipper *handZipper = [HandZipper alloc]; 
    zipPath = [handZipper compressHands:(filePath):(processStatus)]; 

    ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:@"http://allseeing-i.com/ignore"]] autorelease]; 

    [request setRequestMethod:@"PUT"]; 
    [request setPostBodyFilePath:zipPath]; 
    [request setShouldStreamPostDataFromDisk:YES]; 
    [request setDelegate:self]; 
    [request setUploadProgressDelegate:progressIndicator]; 
    [request setDidFinishSelector:@selector(postFinished:)]; 
    [request setDidFailSelector:@selector(postFailed:)]; 
    [request startSynchronous]; 

} 

答えて

2

あなたは常にメインスレッド上のUI要素を更新する必要があります。 showProgressView:がメインスレッドから呼び出されることがわかっている場合は、[box setContentView:view];および[uploadViewController updateLabel];からdispatch_asyncを削除し、直接呼び出してください。そうでない場合showProgressView:が別のスレッドから呼び出された場合は、queueの代わりにdispatch_get_main_queue(void)を使用してください。

+0

ty、ty。よく説明され、それは働いた。 –

関連する問題