0

Parse からすべてのデータを取得し、このデータを携帯電話の Core Data と同期しようとしています。現在、フェッチ リクエストが正しく実行されないという小さな問題が発生しています。原因は、別のタスクに managedObjectContext を使用しているためだと思いますが、これを修正する方法がよくわかりません。

コード内で問題が発生する場所を明確に示します。私のコードはクラッシュしませんが、ログにエラーを出力するだけなので、非常に奇妙です。(コードのすぐ下のログに結果を表示しました)

これは私のコードです:

// CORE DATA UPDATE

for var i = 0; i < self.messages.count; i++ {
let entity = NSEntityDescription.entityForName("Groups", inManagedObjectContext: self.managedObjectContext)
let newGroup = Groups(entity: entity!, insertIntoManagedObjectContext: self.managedObjectContext)

newGroup.groupId = self.messages[i].groupId
newGroup.updatedAt = NSDate()
newGroup.groupName = self.messages[i].groupName
self.messages[i].imageFile.getDataInBackgroundWithBlock({ (imageData, error) -> Void in
    if error == nil{
        newGroup.photo = imageData
    }else{
        print(error)
    }
})
newGroup.lastMessage = self.messages[i].message

let usersRelationship = newGroup.mutableSetValueForKey("Users")
let arrayMembers = self.dictionaryGroupIds[self.messages[i].groupId]! as [String]

print(arrayMembers)

for member in arrayMembers {

    print(member) 
    print("CODE IS STOPPING HERE ")
    // MY CODE STOPS HERE

    // When I want to print the members in the arraymembers, it never displays all the member, sometimes it is only one member than it is 3 members, but never all of them so

    let fetchRequest = NSFetchRequest(entityName: "Users")
    fetchRequest.predicate = NSPredicate(format: "username = %@", member)
    fetchRequest.returnsObjectsAsFaults = false

    do {
        let result = try self.managedObjectContext.executeFetchRequest(fetchRequest)
        usersRelationship.addObject(result)
    }catch{
        let fetchError = error as NSError
        print("\(fetchError), \(fetchError.userInfo)")
    }
}

do {
    // This get never printed to the log
    print("SUCCESS")
    try newGroup.managedObjectContext?.save()
} catch {
    let saveError = error as NSError
    print("\(saveError), \(saveError.userInfo)")
    print("CRASH")
       }
   }
}

ログに表示される内容は次のとおりです。

2016-03-28 08:51:09.511 WeGrupp[1268:35749] Warning: A long-running operation is being executed on the main thread. 
 Break on warnBlockingOperationOnMainThread() to debug.
2016-03-28 08:51:09.823 WeGrupp[1268:35749] Warning: A long-running operation is being executed on the main thread. 
 Break on warnBlockingOperationOnMainThread() to debug.
["test1@info.com", "test2@info.com", "test3@info.com", "test4@info.com", "test5@info.com", "test6@info.com"]
te1t2@info.com
CODE IS STOPPING HERE
2016-03-28 08:51:10.140 WeGrupp[1268:35749] -[__NSArrayI entity]: unrecognized selector sent to instance 0x7fb0eb4d5c60
2016-03-28 08:51:10.143 WeGrupp[1268:35749] Warning: A long-running operation is being executed on the main thread. 
 Break on warnBlockingOperationOnMainThread() to debug.

これで終わりです。同時実行と関係があると思いますが、残念ながら質問に対する答えが見つかりませんでした。私は他のフォーラムに参加しましたが、誰も適切な回答を提供できませんでした.

どうもありがとう

4

1 に答える 1

0

まず、 にブレークを設定して、解析の警告を取り除くことをお勧めしますwarnBlockingOperationOnMainThread()。現在のコードにフォアグラウンドの Parse 呼び出しが見当たらないので、別の場所にあるはずです。This SO questionには、ブレークポイントを定義する方法を示す回答があります。

次に、次のコードが問題です。

self.messages[i].imageFile.getDataInBackgroundWithBlock({ (imageData, error) -> Void in
    if error == nil{
        newGroup.photo = imageData
    }else{
        print(error)
    }
})

newGroupは CoreData エンティティであり、その MOC を保存しようとしていますが、バックグラウンドでも更新しています。それが問題の原因であるかどうかを確認する簡単な最初のステップとして、このコードをコメントアウトします。理想的には、MOC をすべての画像の読み込みの最後に 1 回だけ保存する必要があります。

第三に、コードがクラッシュしています-「認識されないセレクターがインスタンスに送信されました」。すべての例外を中断することで、これがどこで発生しているかを確認できます。ブレークポイント ナビゲーターの下でこれを行います。

ブレークポイントを追加

于 2016-03-29T01:17:04.390 に答える