小编Jon*_*han的帖子

CloudKit fetchRecordChangesOperation给出"AppDefaultZone不支持同步语义"

我正在使用CKFetchRecordChangesOperation和CKFetchRecordsChangeToken来获取更改,它告诉我"AppDefaultZone不支持同步语义".

这是违规代码:

- (void)downloadServerChangesWithCompletionBlock:(void (^)(NSError *error))completionBlock
{
    // Prepare to fetch remote changes
    CKDatabase *database = [CKContainer defaultContainer].privateCloudDatabase;
    CKRecordZoneID *zoneID = [[CKRecordZoneID alloc] initWithZoneName:CKRecordZoneDefaultName ownerName:CKOwnerDefaultName];

    // Initialize fetch record changes operation
    CKFetchRecordChangesOperation *fetchRecordChangesOperation = [[CKFetchRecordChangesOperation alloc] initWithRecordZoneID:zoneID previousServerChangeToken:[self changeToken]];
    fetchRecordChangesOperation.recordChangedBlock = ^(CKRecord *record) {
        [self performRecordChange:record];
    };
    fetchRecordChangesOperation.recordWithIDWasDeletedBlock = ^(CKRecordID *recordID){
        [self performRecordDeletion:recordID];
    };
    fetchRecordChangesOperation.fetchRecordChangesCompletionBlock = ^(CKServerChangeToken *serverChangeToken, NSData *clientChangeTokenData, NSError *error) {
        if (error) {
            completionBlock(error);
        } else {
            [self setChangeToken:serverChangeToken];
            completionBlock(nil);
        }
    };

    // Perform the operation
    [database …
Run Code Online (Sandbox Code Playgroud)

objective-c ios cloudkit ckfetchrecordchangesopera

10
推荐指数
1
解决办法
1270
查看次数

CloudKit CKModifyRecordsOperation给了我一个"保护数据不匹配"

我正在尝试使用CloudKit上传一些记录更改.我正在使用CKModifyRecordsOperation来批量上传设备上已更改的记录.记录都在自定义区域中

由于某种原因,操作不断回来,并告诉我""保护数据不匹配"

这是代码:

- (void)updloadLocalChangesWithCompletionBlock:(void (^)(NSError *error))completionBlock
{
   // Initialize the data
   NSArray *localChanges = self.localChanges;
   NSArray *localDeletions = self.localDeletions;

   // Initialize the database and modify records operation
   CKDatabase *database = [CKContainer defaultContainer].privateCloudDatabase;
   CKModifyRecordsOperation *modifyRecordsOperation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:localChanges recordIDsToDelete:localDeletions];
   modifyRecordsOperation.savePolicy = CKRecordSaveAllKeys;

   NSLog(@"CLOUDKIT Changes Uploading: %d", localChanges.count);

   // Add the completion block
   modifyRecordsOperation.modifyRecordsCompletionBlock = ^(NSArray *savedRecords, NSArray *deletedRecordIDs, NSError *error) {
       if (error) {
           NSLog(@"[%@] Error pushing local data: %@", self.class, error);
       }

       [self.localChanges removeObjectsInArray:savedRecords];
       [self.localDeletions removeObjectsInArray:deletedRecordIDs];

       completionBlock(error);
   }; …
Run Code Online (Sandbox Code Playgroud)

objective-c ios icloud cloudkit

8
推荐指数
2
解决办法
4112
查看次数

查询CloudKit用户记录提供"无法查询系统类型"

好的,所以我在CloudKit之上构建游戏,我想查询排名前50位的用户.

// Create a CKQuery
let predicate = NSPredicate(value: true)
let sortDescriptor = NSSortDescriptor(key: "score", ascending: false)
var query = CKQuery(recordType: "Users", predicate: predicate)
query.sortDescriptors = [sortDescriptor]

// Create a query operation
var queryOperation = CKQueryOperation(query: query)
queryOperation.resultsLimit = 50
queryOperation.recordFetchedBlock = { (record: CKRecord!) -> Void in
    self.records.append(record)
}
queryOperation.queryCompletionBlock = { (cursor: CKQueryCursor!, error: NSError!) in
    // Log an error and show and alert
    if error != nil {
        println("Error querying for leaderboard: \(error)")
        var alert = UIAlertController(title: …
Run Code Online (Sandbox Code Playgroud)

objective-c ios swift cloudkit

6
推荐指数
1
解决办法
1565
查看次数

"无法覆盖已标记为不可用的'init'"可防止覆盖空init

我有一种情况,我试图覆盖,NSError以提供一个错误的实例,我将重新使用很多.

我的代码工作,直到我更新Xcode并转换为Swift 2.

public class NAUnexpectedResponseTypeError: NSError {
    public convenience init() {
        let messasge = "The object fetched by AFNetworking was not of an expected type."
        self.init(
            domain: "MyDomain",
            code: 6782,
            userInfo: [NSLocalizedDescriptionKey: messasge]
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

编译说Cannot override 'init' which has been marked unavailable.通过这样做,我能够破解它:

public class NAUnexpectedResponseTypeError: NSError {
    public class func error() -> NSError {
        let message = "The object fetched by AFNetworking was not of an expected type."
        return NAUnexpectedResponseTypeError(
            domain: "MyDomain",
            code: …
Run Code Online (Sandbox Code Playgroud)

ios swift swift2

6
推荐指数
1
解决办法
3397
查看次数

iOS CloudKit在-fetchUserRecordIDWithCompletionHandler的完成块上崩溃:

我正在为CloudKit编写初始化方法.我在获取用户ID /帐户状态时遇到的问题.

我在打电话[[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:].

它稍后崩溃,调试器将我指向"Queue:com.apple.cloudkit.operation.callback(serial)queue"线程.

此方法是唯一具有应该执行的回调的CloudKit相关方法.

这是方法本身:

[[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
    NSLog(@"CLOUDKIT Fetching User Record ID");

    if (error) {
        NSLog(@"[%@] Error loading CloudKit user: %@", self.class, error);
    }

    if (recordID) {
        NSLog(@"CLOUDKIT Found User Record ID: %@", recordID.recordName);

        // If there is a record ID we check for account status
        [[CKContainer defaultContainer] accountStatusWithCompletionHandler:^(CKAccountStatus accountStatus, NSError *error) {
            NSLog(@"CLOUDKIT Finding Account Status");

            if (error) {
                NSLog(@"[%@] Error checking CloudKit availability: %@", self.class, error);
            }

            if …
Run Code Online (Sandbox Code Playgroud)

multithreading objective-c ios objective-c-blocks cloudkit

5
推荐指数
1
解决办法
1331
查看次数

NSDate格式扩展中的EXC_BAD_ACCESS

我正在为NSDate编写一个扩展,它提供了一些可用的初始化程序.这里的最终目标是从API获取日期时间字符串并将其解析为NSDate,例如

let createdAt = NSDate(apiDateTimeString: "2016-03-29T18:33:49+06:00")
let createdAt = NSDate(apiDateTimeString: "2016-03-29T18:33:49.730+06:00")
Run Code Online (Sandbox Code Playgroud)

日期时间字符串可以采用以下两种格式之一:

  • yyyy-MM-dd'T'HH:mm:ssZZZZZ
  • yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ

这是扩展的样子:

import Foundation

public extension NSDate {

    // MARK: Custom Initializers

    public convenience init(date: NSDate) {
        self.init(timeInterval: 0.0, sinceDate: date)
    }

    public convenience init?(dateString: String, formatString: String) {
        let formatter = NSDateFormatter()
        formatter.dateFormat = formatString
        formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
        if let date = formatter.dateFromString(dateString) {
            self.init(date: date)
        } else {
            return nil
        }
    }

    public convenience init?(apiDateTimeString: String?) {
        guard let dateString = apiDateTimeString else { …
Run Code Online (Sandbox Code Playgroud)

exc-bad-access nsdate foundation ios swift2

1
推荐指数
1
解决办法
271
查看次数