2

私は自分のアプリにバックグラウンド スレッドを実装して、長時間のハード グラフト アップロードを実行しようとしています。

私は FBConnect SDK を使用しており、完全に動作していますが、GUI 側をスムーズに動作させたいと考えており、現在、アップロードを開始する前にアプリで顕著な一時停止が発生しています。

現時点では、アップロード ジョブをキューに追加し、「startQueue」を実行しています。

これにより、キューから最初のジョブが取得され、画像のサイズが変更され、Facebook へのアップロードが開始されます。

独自のスレッドで実行を開始するのは、URL 要求が作成された時点でのみであり、GUI の制御を取り戻すことができます。

私が望むのは、キューにジョブを追加してから、別のスレッドで「startQueue」を実行できるようにすることです。これにより、すぐに GUI を制御できるようになります。

何が起こっているかというと、すぐに GUI に戻り、画像のサイズが変更され (新しいスレッドで)、Facebook のアップロードが (これも新しいスレッドで) 開始されますが、何も起こりません。

この子スレッドでできることとできないことについて、何らかの制限はありますか? URL 接続は許可されていませんか? 電話にエラーはないようで、問題なくジョブをキューに追加できますが、最初のアップロードは完了しません。

init メソッドはスレッドを作成します...

bgThread = [[NSThread alloc] initWithTarget:self selector:@selector(startQueue) object:nil];

次に、 add job メソッドがそれを開始します...

[bgThread start];

その後、これは次のように実行されます...

-(void)startQueue
{
    running = TRUE;

    bgPool = [[NSAutoreleasePool alloc] init];

    [self startJob];
}

-(void)startJob
{
    NSDictionary *currentJob = [NSDictionary dictionaryWithDictionary:[jobQueue objectAtIndex:0]];
    NSArray *networks = [currentJob objectForKey:@"networks"];

    NSLog(@"Resizing image");

    NSLog(@"Starting Uploads");

    for (int i = 0; i < [networks count]; i++)
    {
        NSString *networkName = [networks objectAtIndex:i];

        if ([networkName isEqualToString:@"Facebook"])
        {
            NSLog(@"Facebook");
            currentUploads += 1;
            [self.fbDelegate uploadPhoto:uploadImage withCaption:[currentJob objectForKey:@"caption"]];
        }
    }
}

スレッドを使用しなくても (つまり、startJob を実行するだけで)、すべてが完全に機能します。bgThread start を呼び出すと、完全に実行され、Facebook NSLog を取得できますが、ジョブは決して終了しません。エラーになっても終わりません。

あなたが提供できるかもしれないポインタやヒントをありがとう!

オリバー

4

0 に答える 0