Ios 将Swift数组从后台复制到前台

Ios 将Swift数组从后台复制到前台,ios,objective-c,swift,marshalling,Ios,Objective C,Swift,Marshalling,如果我们从Swift背景转到前景,在Swift中[nsObject copy]的正确方式是什么 例如,在Objective-C中,我们将通过执行以下操作循环背景中的一长串集合(比如10000+): [alGroup enumerateAssetsUsingBlock:^(ALAsset *alPhoto, NSUInteger index, BOOL *stop) { // Here to make changes for speed up image loading from de

如果我们从Swift背景转到前景,在Swift中[nsObject copy]的正确方式是什么

例如,在Objective-C中,我们将通过执行以下操作循环背景中的一长串集合(比如10000+):

[alGroup enumerateAssetsUsingBlock:^(ALAsset *alPhoto, NSUInteger index, BOOL *stop)
  {
    // Here to make changes for speed up image loading from device library...

    // =====================================================
    // >>>>>>>>>>>>>>>>>>> IN BACKGROUND <<<<<<<<<<<<<<<<<<<
    // =====================================================

    if(alPhoto == nil)
    {
      c(@"number of assets to display: %d", (int)bgAssetMedia.count);
      // c(@"All device library photos uploaded into memory...%@", bgAssetMedia);
      dispatch_async(dispatch_get_main_queue(), ^(void)
      {
       // =====================================================
       // >>>>>>>>>>>>>>>>>>> IN FOREGROUND <<<<<<<<<<<<<<<<<<<
       // =====================================================
        [ui hideSpinner];

       if (_bReverse)
         // Here we copying all the photos from device library into array (_assetPhotos)...
         _assetPhotos = [[NSMutableArray alloc] initWithArray:[[[bgAssetMedia copy] reverseObjectEnumerator] allObjects]];
       else
         _assetPhotos = [[NSMutableArray alloc] initWithArray:[bgAssetMedia copy]];

        // NSLog(@"%lu",(unsigned long)_assetPhotos.count);
         if (_assetPhotos.count > 0)
         {
           result(_assetPhotos);
         }
      });
    } else {
      // if we have a Custom album, lets remove all shared videos from the Camera Roll
      if (![self isPhotoInCustomAlbum:alPhoto])
      {
        // for some reason, shared glancy videos still show with 00:00 minutes and seconds, so remove them now
        BOOL isVideo = [[alPhoto valueForProperty:ALAssetPropertyType] isEqual:ALAssetTypeVideo];
        int duration = 0;
        int minutes  = 0;
        int seconds  = 0;
        // NSString *bgVideoLabel = nil;
        if (isVideo)
        {
          NSString *strduration = [alPhoto valueForProperty:ALAssetPropertyDuration];

          duration = [strduration intValue];
          minutes  = duration / 60;
          seconds  = duration % 60;

          // bgVideoLabel = [NSString stringWithFormat:@"%d:%02d", minutes, seconds];
          if (minutes > 0 || seconds > 0)
          {
            [bgAssetMedia addObject:alPhoto];
          }
        } else {
          [bgAssetMedia addObject:alPhoto];
        }
      }
    }
     // NSLog(@"%lu",(unsigned long)bgAssetMedia.count);
  }];
“复制”功能是一种黑魔法,它允许我们快速地将内存从后台编组到前台,而无需再次循环数组。 Swift中是否有类似的方法?也许是这样的:

_assetPhotos = NSMutableArray(array: bgAssetMedia.copy())

Swift线程现在可以安全地将内存指针从后台传递到前台吗?新的协议是什么?谢谢-

我找到了答案。在领域和CoreData数据库上下文上运行大型查询之后。我发现只需制作内存指针的基本副本并向下转换它以匹配类就很容易了

let mediaIdFG = mediaId.copy() as! String
下面是一个完整的例子:

static func createOrUpdate(dictionary:NSDictionary) -> Promise<Media> {
    // Query and update from any thread
    return Promise { fulfill, reject in
      executeInBackground {
//        c("BG media \(dictionary)")
        let realm:RLMRealm = RLMRealm.defaultRealm()
        realm.beginWriteTransaction()
        let media = Media.createOrUpdateInRealm(realm, withJSONDictionary:dictionary as [NSObject : AnyObject])
        // media.type = type
        c("BG media \(media)")
        let mediaId = media.localIdentifier
        do {
          try realm.commitWriteTransaction()
          executeInForeground({
            let mediaIdFG = mediaId.copy() as! String
            let newMedia = Media.findOneByLocalIdentifier(mediaIdFG)
            c("FG \(mediaIdFG) newMedia \(newMedia)")
            fulfill(newMedia)
          })
        } catch {
          reject( Constants.createError("Realm Something went wrong!") )
        }
      }
    } // return promise
  } // func createOrUpdate
static func createOrUpdate(字典:NSDictionary)->Promise{
//从任何线程进行查询和更新
返回承诺{履行,拒绝
高管背景{
//c(“BG媒体\(字典)”)
let realm:RLMRealm=RLMRealm.defaultRealm()
realm.beginWriteTransaction()
让media=media.createOrUpdateInRealm(领域,JSONDictionary:dictionary为[NSObject:AnyObject])
//media.type=type
c(“BG媒体\(媒体)”)
让mediaId=media.localIdentifier
做{
尝试realm.commitWriteTransaction()
执行信息重磨({
将mediaIdFG=mediaId.copy()设为!字符串
让newMedia=Media.findOneByLocalIdentifier(mediaIdFG)
c(“FG\(mediaIdFG)newMedia\(newMedia)”)
(新媒体)
})
}抓住{
拒绝(Constants.createError(“出现了问题!”)
}
}
}//回报承诺
}//func createOrUpdate
发布我自己的答案,让你知道我的发现。我还发现了这篇关于Swift的copy()又称objc的copyWithZone的有用文章:

static func createOrUpdate(dictionary:NSDictionary) -> Promise<Media> {
    // Query and update from any thread
    return Promise { fulfill, reject in
      executeInBackground {
//        c("BG media \(dictionary)")
        let realm:RLMRealm = RLMRealm.defaultRealm()
        realm.beginWriteTransaction()
        let media = Media.createOrUpdateInRealm(realm, withJSONDictionary:dictionary as [NSObject : AnyObject])
        // media.type = type
        c("BG media \(media)")
        let mediaId = media.localIdentifier
        do {
          try realm.commitWriteTransaction()
          executeInForeground({
            let mediaIdFG = mediaId.copy() as! String
            let newMedia = Media.findOneByLocalIdentifier(mediaIdFG)
            c("FG \(mediaIdFG) newMedia \(newMedia)")
            fulfill(newMedia)
          })
        } catch {
          reject( Constants.createError("Realm Something went wrong!") )
        }
      }
    } // return promise
  } // func createOrUpdate