标签: cloudkit

NSOperationQueue 的 addOperation: 操作已完成无法入队?

注意:
这只是一个概念验证。
真正的后台任务是不断请求原始数据的“HTTP Get”并通过主线程显示;一经请求。

场景:
1)按需切换后台任务(循环)。
2) 后台任务在每次迭代时通知主线程 UI。
3) 只有一 (1) 个块操作在队列中运行。

Modus Operandus
1) 使用 NSBlockOperation 来包含后台代码。
2)使用区域BOOL来切换循环;通过 IBAction。

问题
1) 编译器将 BOOL 'isRunning' 标记为链接:

在此块中强烈捕获“自我”可能会导致保留循环。


2)在尝试添加块操作之前,我检查了队列中是否有任何操作。
但我总是收到以下错误:

-[NSOperationQueue addOperation:]: 操作完成,不能入队

除了上述问题之外,这种概念验证似乎正在发挥作用。

问题:
1) 为什么编译将 BOOL 'running' 标记为一个强行,而它只是一个缩放器?
2)如果在队列中没有找到,为什么我不能通过添加另一个 NSBlockOperation 来重用 NSOperationQueue?

以下是整个代码:

#define START 0
#define STOP 1

@interface ricViewController ()
@property (assign) BOOL running;
@end

@implementation ricViewController {
    NSOperationQueue *operationQueue;
    NSBlockOperation *blockOperation;
    void (^backgroundBlock)(void);
}

@synthesize running = isRunning;

#pragma mark - ViewController methods …
Run Code Online (Sandbox Code Playgroud)

objective-c nsoperationqueue ios nsblockoperation cloudkit

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

有没有办法在同一台Mac上调试两个iOS设备?

我想这是不可能从同一个Xcode,但通过多次打开Xcode?还是其他任何招数?我正在测试它们之间的CKSubscription和CloudKit通信.

debugging xcode ios cloudkit cksubscription

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

如何在CloudKit中撤消用户可发现性权限?

我很好奇,用户可以以某种方式更改发现权限.我在设置中找不到方法.

ios cloudkit

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

CloudKit:将容器环境从开发切换到生产

我正在构建一个测试工具来验证CloudKit中的内容,但我希望能够选择容器的环境.

在iOS上,您可以在导出应用程序进行临时测试时选择"开发"或"生产"环境,但在OS X上没有该选项.它始终指向"开发"环境.

任何人都知道,如果在OS X或iOS上有一种以编程方式设置或选择要使用的容器环境的方法吗?

xcode objective-c ios cloudkit

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

在不获取的情况下增加CKRecord变量中的字段值?

我很好奇是否有可能在不获取的情况下增加CKRecord变量中的字段值?因此,对于客户端,我对最近的值并不感到好奇,我只想增加任何值即可。原因是,操作应尽可能快速简便,而不是两个消息“流”,我只希望启动一个。

ios cloudkit

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

CKFetchRecordsOperation + CKQueryOperations ...我错过了什么?

在大量搜索示例代码之后,管理好一起CKFetchRecordsOperation; 这是......但我一定错过了什么.不要误会我的意思......但......

要执行CKFetchRecordsOperation,您需要一个CKRecordIDs的NSArray; 要获得CKRecordIDs的NSArray,您需要执行CKQuery,您可以构建CKRecordIDs的NSArray.

但是等一下,提取CKRecordIDs的过程使用CKQuery,我可以直接下载CKRecords吗?

如果没有CKQuery,你如何获得CKRecordID的NSArray?

-(void)doSingleBeaconsDownload
{
    CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:@"iCloud.cqd.ch.BeaconBrowser"] publicCloudDatabase];
    NSPredicate *predicatex = [NSPredicate predicateWithFormat:@"iBeaconConfig = %@",iBeaconsConfirmed.giReferenceID];
    CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Running" predicate:predicatex];

    [self.delegate performSelectorOnMainThread:@selector(processCompleted:) withObject:@"Downloading Configuration ..." waitUntilDone:YES];

    [publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {

        if (error) {
            NSLog(@"Batch Download Error iCloud error %@",error);
        }
        else {
            NSMutableArray *rex2download = [[NSMutableArray alloc] init];
            for (CKRecord *rex in results) {
                [rex2download addObject:rex.recordID];
            }

            CKFetchRecordsOperation *fetchRecordsOperation = [[CKFetchRecordsOperation alloc] initWithRecordIDs:rex2download];

           /* fetchRecordsOperation.perRecordCompletionBlock = ^(CKRecord *record, …
Run Code Online (Sandbox Code Playgroud)

objective-c nsoperation ios cloudkit ckrecord

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

添加新条目后如何重新加载tableview?

我正在创建一个cloudkit tableview.我加载应用程序,我的tableview显示我的云套件条目.

然后我使用我的add方法insertNewObject将记录添加到云套件中,但这不会显示在我的tableview中.它只会出现在我下次运行的应用程序中.

   func insertNewObject(sender: AnyObject) {

    let record = CKRecord(recordType: "CloudNote")
    record.setObject("New Note", forKey: "Notes")

    MyClipManager.SaveMethod(Database!, myRecord:record)
    dispatch_async(dispatch_get_main_queue()) {
        self.tableView.reloadData()
    }


    }
Run Code Online (Sandbox Code Playgroud)

这是我的添加方法.我正在调用tableview重载,你可以看到,但什么也没发生.

我的tableview创建代码:

    // Tableview stuff --- Done

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}
        /////// Get number of rows
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return objects.count
}
        //// FIll the table
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) …
Run Code Online (Sandbox Code Playgroud)

uitableview tableview ios swift cloudkit

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

CloudKit身份验证登录/密码

这是我的问题,我使用Parse解决方案构建了一个应用程序.在这个应用程序中,我使用了Parse的基本验证.在Parse死后,我需要迁移.

我想实现与CloudKit解决方案的验证,但我不知道这是一个很好的实践.我知道Cloudkit基本身份验证基于用户apple帐户.但我需要使用登录名/密码进行身份验证.

在Parse中没有类似"密码"的字段,所以我不知道如何以安全的方式在我的表中存储密码.而且我不确定在公共部分保存密码是否安全.

我想知道在CloudKit(登录/密码)中是否有良好的实践来实现基本身份验证?

在此先感谢您的帮助;)

PS:其他解决方案应该是移动到firebase,但我更喜欢CloudKit的逻辑.

authentication ios parse-platform cloudkit

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

CloudKit订阅未在iOS10上保存

我正在关注"CloudKit最佳实践"WWDC关于添加订阅的讨论,这似乎在iOS10中有所改变.

下面的代码返回'Success!',但是我的'AllChanges'订阅从未出现在CloudKit仪表板上的订阅类型中.

我在Xcode 8 beta 6上.

    let subscription = CKDatabaseSubscription(subscriptionID:"AllChanges")
    let notificationInfo = CKNotificationInfo()
    notificationInfo.shouldSendContentAvailable = true
    subscription.notificationInfo = notificationInfo

    let operation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: [])
    operation.modifySubscriptionsCompletionBlock =  {
        (modifiedSubscriptions: [CKSubscription]?, deletedSubscriptionIDs: [String]?, error: Error?) -> Void in

        if error != nil {
            print(error!.localizedDescription)
        } else {
            print("Success!")
        }
    }
    operation.qualityOfService = .utility
    privateDatabase.add(operation)
Run Code Online (Sandbox Code Playgroud)

ios swift cloudkit cksubscription ios10

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

CloudKit错误处理 - 重试逻辑

我想在我的应用程序中放置出色的CloudKit错误处理,就像Apple希望我们这样做.我想立即保存和修改记录.这是我的基本保存逻辑......

func addNewRecord(managedObj: NSManagedObject) {
  let newRec = managedObj.convertToCkRecord()
  publicDB.saveRecord(newRec, completionHandler: saveHandler)
}

func saveHandler(savedRecord: CKRecord?, error: NSError?) {
  // handle errors here
  if let error = error {

    if error.code == CKErrorCode.NotAuthenticated.rawValue {
      // debug
      print("Not authentricated")
    }
    else if error.code == CKErrorCode.NetworkFailure.rawValue {
      print("Network failure!!")
      if let retryAfterValue = error.userInfo[CKErrorRetryAfterKey] as? NSTimeInterval {

        let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(retryAfterValue * Double(NSEC_PER_SEC)))
        dispatch_after(delayTime, dispatch_get_main_queue()) {
          // THIS IS WHERE I GET STUCK, WHERE DO I FIND THE FAILED CKRECORD FOR …
Run Code Online (Sandbox Code Playgroud)

multithreading nserror swift cloudkit ckrecord

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