5

キューに入れた NSOperation があります。NSOperation は長時間実行される写真処理を実行し、その写真のコア データに情報/メタ データを保存します。私のカスタム NSOperation クラスのメイン メソッドでは、以下のコード ブロックを実行します。

-(void)main
{
    //CODE ABOVE HANDLES PHOTO PROCESSING...
    //........

    //THEN I SAVE ALL DATA BELOW LIKE SO
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {

        Post *post = [Post createInContext:localContext];

        //set about 15 pieces of data, all strings and floats
        post.XXXX = XXXXX;
        post.DDDD = DDDDD;
        etc...
    } completion:^(BOOL success, NSError *error) {
        NSLog(@"Done saving");
    }];
}

私の問題は、保存時に写真が 3 枚しかない場合でも、UI が本当にフリーズすることです。これを NSOperation で実行しても問題ないと思っていたでしょう。

各 NSOperation は 1 枚の写真を処理するため、キューに 5 ~ 10 枚の写真が含まれる場合があることを付け加えておく必要がありますが、UI がフリーズすると言ったように 3 枚だけでも、違いはないと思います。

お手伝いありがとう。

更新:------------ * --------------

バージョン2.2に切り替えましたが、UIがさらにブロックされているようです...また、現在使用しています

-(void)main
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext    contextForCurrentThread];
    //CODE BELOW HANDLES PHOTO PROCESSING...
    //........

    //THEN I SAVE ALL DATA BELOW LIKE SO
    Post *post = [Post createInContext:localContext];

    //set about 15 pieces of data, all strings and floats
    post.XXXX = XXXXX;
    post.DDDD = DDDDD;


    [localContext saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {

    }];
}

これはすべて私の NSOperation クラスで行われますが、何か間違っていますか?

4

2 に答える 2

10

saveWithBlock 呼び出しをバックグラウンド スレッドに入れないでください。バックグラウンド スレッドからバックグラウンド スレッドを効果的に作成しているため、この場合は速度が低下しています。saveWithBlock を呼び出すだけで、すべての保存コードがバックグラウンドに置かれるはずです。ただし、コードのメイン UI ページですべての変更を行い、後で save を呼び出すだけであることにも気付きました。これは、このメソッドの間違った使い方です。あなたはこのようなことをしたい:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    Post *post = [Post createInContext:localContext];

    //photo processing
    //update post from photo processing
} completion:^(BOOL success, NSError *error) {
   //This is called when data is in the store, and is called on the main thread
}];

NSOperation が必要な場合は、別のパターンをお勧めします。

- (void) main {
   NSManagedObjectContext *localContext = [NSManagedObjectContext confinementContext];
  // Do your photo stuff here

  Post *post = [Post createInContext:localContext];
  //more stuff to update post object

  [localContext saveToPersistentStoreAndWait];

}
于 2013-06-25T20:52:28.057 に答える