0

編集

わかりました、私はそれを理解したと思います。

私の全体的な操作の流れは次のとおりです。

-(void)submitRegistration
{    
    //[[AppDelegate sharedDelegate] drupalLogin];

    [self validateFields];

    if(fieldsValid)
    {
        [self createBike];

        // save member node will save bike node too if successful
        // bike node will not be saved if member node did not save successful
        [self saveMemberNode];

        // save the updated member node and bike node to Core Data
        [self saveLocalRegistration]; 
        // *** ABOVE LINE GETS EXECUTED BEFORE ASYNC REQUEST FINISHES ***
    }
}

私の「[self saveLocalRegistration];」非同期リクエスト「ブロック」の実行が完了する前にコードが実行されたため、クラッシュが発生しました。

「saveLocalRegistration」メソッドは [managedObjectContext save:&error]; を呼び出します。

元の質問

Core Data に初めて飛び込みました。

私のアプリでやろうとしていることの 1 つは、データを Drupal サーバーに送信することです。

問題を次のように絞り込みました。

// *** *** *** 
// doesn't crash here
// *** *** ***
NSLog(@"bike.brand = %@", bike.brand);
NSLog(@"bike.model = %@", bike.model);
NSLog(@"bike.features = %@", bike.features);

// save new member node to Drupal
[DIOSNode nodeSave:memberData success:^(AFHTTPRequestOperation *operation, id responseObject) 
 {
     NSLog(@"Node saved!");
     NSDictionary *serverNodeData = (NSDictionary *)responseObject;

     NSLog(@"Server node details = %@", serverNodeData);

     // set the member's memberId to the newly created Drupal member node's nodeId
     member.memberId = [NSNumber numberWithLong:[[serverNodeData valueForKey:@"nid"] longLongValue]];

     // *** *** ***
     // accessing bike properties here inside this objective c "Block" crashes app
     // somehow the above line "member.memberId = .... " doesn't crash despite both being Core Data entities
     // *** *** ***
     NSLog(@"bike.brand = %@", bike.brand); // <--- CRASH HERE ***
     NSLog(@"bike.model = %@", bike.model);
     NSLog(@"bike.features = %@", bike.features);

     //bike.ownerId = member.memberId;

     // save bike node with member id
     [self saveBikeNode];
 } 
           failure:^(AFHTTPRequestOperation *operation, NSError *error) 
 {
     NSLog(@"Failed to save node, error: %@", [error localizedDescription]);
 }];

上記のソース コードからわかるように、NSLogs の最初のブロックはアプリをクラッシュさせませんが、目標 c "Block" 内で、NSLogs の同じブロックがアプリをクラッシュさせます。

注: "[DIOSNode nodeSave:memberData success:...." Objective C ブロックは非同期要求だと思います。これがマルチスレッドの問題であるかどうかはわかりません。

bike.brand、bike.model、bike.features は「文字列」データ型です。

4

2 に答える 2

0

クラッシュ直前のデバッガーの状態を確認することで確認できましたが、管理対象オブジェクトに属していないスレッドからアクセスしていると理解しています。

管理オブジェクト コンテキスト設計キュー (performBlock および performBlockAndWait) で成功ブロックをスケジュールする必要があります。

于 2012-06-20T08:20:49.200 に答える
0

これをブロックの外で宣言し、'self' の代わりに ur ブロック内で使用します

__block <classname> *blocksafeSelf = self;
于 2012-06-20T05:45:00.763 に答える