私は自分のアプリにバックグラウンド スレッドを実装して、長時間のハード グラフト アップロードを実行しようとしています。
私は 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 を取得できますが、ジョブは決して終了しません。エラーになっても終わりません。
あなたが提供できるかもしれないポインタやヒントをありがとう!
オリバー