Đọc câu trả lời này nếu thông báo lỗi tham chiếu các tệp Dữ liệu lõi
Tóm tắt: Bạn có thể có cả các tệp lớp đối tượng được quản lý dữ liệu Core được tạo tự động và được tạo thủ công.
Câu trả lời này áp dụng nếu dòng đầu tiên của lỗi đề cập đến tệp Foo + CoreDataProperIES.o hoặc Foo + CoreDataClass.o . Thí dụ:
error: Multiple commands produce '/Users/me/Library/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/ MyApp /Debug-iphonesimulator/ MyApp.build/Objects-normal/x86_64/Foo+CoreDataProperties.o':
1) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files
2) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files
Nguyên nhân gốc có thể được nhìn thấy bằng cách mở rộng phần Compile Swift Source Files của Build Transcript. Ví dụ:
<unknown>:0: error: filename "Address+CoreDataClass.swift" used twice: '/Users/myUserName/Projects/Jnky/Foo+CoreDataProperties' and '/Users/jk/myUserName/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/MyApp.build/Debug/MyApp.build/DerivedSources/CoreDataGenerated/Jnky/Foo+CoreDataProperties.swift'
Tệp đầu tiên được đề cập có một tệp nguồn trong thư mục dự án của bạn, được ai đó tạo bằng cách chọn mô hình dữ liệu của bạn trong Trình điều hướng dự án và nhấp vào menu Trình chỉnh sửa > Tạo lớp đối tượng được quản lý . Tính năng này đã được thêm vào trong Xcode 7 hoặc hơn.
Tệp thứ hai là một tệp có cùng tên nhưng được chôn trong Xcode DerivedData
. Tệp này được tạo tự động bởi Xcode trong mỗi lần xây dựng nếu .xcdatamodeld
tệp mô hình dữ liệu ( ) được bao gồm trong giai đoạn xây dựng Nguồn biên dịch của mục tiêu . Tính năng này đã được thêm vào trong Xcode 9 hoặc hơn. Không, một hoặc hai tệp được tạo cho mỗi thực thể / lớp, tùy thuộc vào cài đặt của cửa sổ bật lên Codegen . Cửa sổ bật lên đó nằm trong Trình kiểm tra mô hình dữ liệu khi bạn chọn một thực thể trong khi chỉnh sửa mô hình dữ liệu của bạn
Các cài đặt là:
- Thủ công / Không có Không có tệp nào được tạo
- Danh mục / Tiện ích mở rộng Một tệp, Foo + CoreDataProperIES.m hoặc .swift được tạo, có chứa danh mục Objective-C hoặc tiện ích mở rộng Swift.
- Định nghĩa lớp Đó cũng tạo tệp Danh mục / Tiện ích mở rộng và ngoài ra, một Foo + CoreDataClass.m hoặc .swift được tạo, chứa khai báo và định nghĩa lớp.
Vì vậy, bạn thấy vấn đề xảy ra khi một nhà phát triển (như tôi), người đã quen với Xcode cũ hơn bắt đầu một dự án trong Xcode mới hơn. Chúng tôi nghĩ rằng chúng tôi cần sử dụng mục trình đơn Tạo lớp đối tượng được quản lý , để thực hiện, để tạo các tệp mà chúng tôi có thể thấy trong Project Navigator trong khi không nhận ra rằng các cài đặt của chúng tôi trong cửa sổ bật lên Codegen đang khiến Xcode tạo các tệp trùng lặp, mà Apple "khéo léo" không hiển thị trong Project Navigator, vì họ không tin tưởng các nhà phát triển đọc và lưu ý nhận xét trong tiêu đề // Tệp này được tạo tự động và không nên chỉnh sửa.
Giải pháp 1 - Sử dụng cách cũ
Bạn có thể tắt tất cả Codegen tự động cho một mô hình dữ liệu chỉ bằng một cài đặt:
- Mở các giai đoạn Xây dựng của mục tiêu (Trong Điều hướng dự án , chọn dự án, sau đó trong danh sách MỤC TIÊU xuất hiện, chọn mục tiêu vấn đề, sau đó chọn tab Giai đoạn xây dựng ).
- Mở rộng mục Nguồn biên dịch và tìm mô hình dữ liệu vấn đề (
.xcdatamodeld
tệp).
- Xóa nó khỏi danh sách biên dịch
- Đảm bảo mô hình dữ liệu được bao gồm trong danh sách Sao chép tài nguyên gói .
Giải pháp 2 - Ma thuật dữ liệu cốt lõi cho người mới bắt đầu
Ở đây, bạn đi tất cả theo cách mới hơn.
- Để lại mô hình dữ liệu của bạn như trong Nguồn biên dịch đó .
- Trong mỗi Thanh tra thực thể trong mô hình dữ liệu của bạn, hãy đặt Codegen thành Định nghĩa lớp .
- Trong Project Navigator, xóa và xóa bất kỳ tệp Foo + CoreDataClass nào và đổi tên bất kỳ tệp Foo + CoreDataProperIES.m hoặc .swift thành một cái gì đó như Foo + MyPropericat .
- Trong mỗi tệp Foo + MyProperIES.m hoặc .swift , nếu có các thuộc tính được tạo bởi Xcode, hãy xóa các thuộc tính này vì chúng sẽ nằm trong các tệp ẩn được tạo bởi Codegen .
Với giải pháp này, các định nghĩa lớp của bạn được tạo tự động từ mô hình dữ liệu trên mỗi bản dựng. Bạn thậm chí không thể nhìn thấy chúng. Đó là Core Data Magic , đẹp và đơn giản cho người mới bắt đầu.
Giải pháp 3 - Dành cho hầu hết các ứng dụng trong thế giới thực
Nhưng Giải pháp 2 không tốt nếu bạn thực sự muốn thêm các thuộc tính không được quản lý. (Objective-C không cho phép các thuộc tính được thêm vào trong các danh mục và Swift không cho phép các thuộc tính được lưu trữ được thêm vào các tiện ích mở rộng.) Vì vậy, trong hầu hết các ứng dụng trong thế giới thực, bạn có thể muốn đi giữa chừng Giải pháp 1 và 2.
- Để mô hình dữ liệu của bạn trong danh sách Nguồn biên dịch
- Trong mỗi Thanh tra thực thể trong mô hình dữ liệu của bạn, hãy đặt Codegen thành Danh mục / Tiện ích mở rộng .
- Trong Project Navigator, xóa và xóa bất kỳ tệp Foo + CoreDataClass.m hoặc .swift nào, và để giảm sự nhầm lẫn trong tương lai, đổi tên bất kỳ tệp Foo + CoreDataProperIES.m hoặc .swift thành có thể chỉ là Foo.m hoặc .swift .
- Đảm bảo rằng mỗi tệp Foo.m hoặc .swift chứa định nghĩa lớp mà bạn có thể thêm các thuộc tính không được quản lý của riêng mình.
(Lời cảm ơn về câu trả lời của Positron. Câu trả lời của tôi ở đây giải thích tại sao câu trả lời của Positron (Giải pháp 1 của tôi) hoạt động và thêm Giải pháp 2 và Giải pháp 3.)