0

パーセからすべてのデータを取得し、このデータを電話機のコアデータと同期しようとしています。私は現在、正しく実行されていないフェッチ要求に少し問題があります。私は、異なるタスクのためにmanagedObjectContextを使用しているという理由があると思いますが、これを修正する方法は実際にはわかりません。コアデータ内のオブジェクトをフェッチしようとするとエラーが発生しました " - [NSArrayIエンティティ]:インスタンスに送信されたセレクタが認識されません"

問題が発生した場所を私のコードで明確に示しています。私のコードがクラッシュすることはないが、ログにエラーが表示されるだけで、それは非常に奇妙です。 (私は、コードの下にログに表示する結果を入れている)

これは私のコードです:

// 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. 
["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"] 
[email protected] 
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. 

だから、これはそれは同時性とは関係があると思いますが、残念ながら私の質問に対する答えは見つけられませんでした。私は他のフォーラムにいましたが、誰も適切な答えを提供することはできませんでした。

感謝

+0

あなたは警告が示唆何をしようと、それが発生しています場所を確認するためにwarnBlockingOperationOnMainThreadに休憩を入れていますか?それにもかかわらず、私はnewGroup変数が変わっても写真をバックグラウンドで設定しようとしていると思われます。 – Michael

+0

CoreDataに写真を保存しようとしていますか?おそらく、MOCを保存した後で、バックグラウンドでロードされているように正しく動作しません。 – Michael

+0

あなたのお手伝いをしてくれてマイケルが、私は本当にそれを得ることができないので、あなたが思うことについてより正確にすることができます。 実際に私がやっているのは、グループの一部であるすべてのユーザーを、同じビューの上にあるこのコードの上に追加しただけでリンクすることです。私はユーザーとグループの間に多対多の関係を作りました。各グループには多くのユーザーがいて、各ユーザーには多数のグループを割り当てることができます – C00kieMonsta

答えて

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回だけ保存することをお勧めします。

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

Add breakpoint

+0

ありがとうございました。私は現在、最初のポイント "warnBlockingOperationOnMainThread()"に取り組んでいます。 – C00kieMonsta

+0

私の郵便に答えることで私の質問が更新されたことが通知されたのか分かりませんが、下に見られるように私はまだ問題に悩まされています。少なくとも私は "warnBlockingOperationOnMainThread()"を取り除くことができましたが、残りの部分についてはまだ取り組んでいます。だから、少し時間があれば、私のコードを見れば嬉しいです。pありがとう – C00kieMonsta

関連する問題