1

私は、時間がかかる何かをするフレームワークを持っています。そのメソッドを呼び出そうとすると、実際には画面内の動きが 0.5 秒間フリーズします。

私はそれをバックグラウンドで呼び出そうとしていました:

[self performSelectorInBackground:@selector(transmitNow:) withObject:nil];

-(void)transmitNow:(id)sender
{
     [instance sendWithData:data]; //takes time 

}

それでも同じくらいの時間がかかります。メインプロセスを停止しないようにバックグラウンドでこれを開始する方法はありますか?

ありがとう 。

4

3 に答える 3

1

私はGCD(Grand Central Dispatch)を使用します:

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    [instance sendWithData:data]; 
};
于 2013-09-27T13:26:04.600 に答える
0

あなたが書いたように見えるものはあなたが望むことをするはずです、私はそれが起こっていることを確認するためにブレークポイントを置きます、
またシングルスレッドアプリでこれを呼び出すことによって、あなたは時間を説明できるマルチスレッドモードに切り替えますあなたは見ています。再度呼び出すと、非常に高速になる場合があります。

バックグラウンドで何かを行うことも危険な場合があるため、ロックを行う準備をしてください。

-(void)transmitNow:(id)sender
{
    @synchronized(data)
    {
         [instance sendWithData:data]; //takes time 
    }
}

また、メインスレッドがデータの競合に遭遇した場合でも、ハングする可能性があることを知っておいてください...参考までに。

于 2013-09-27T13:33:08.263 に答える