我正在开发一个从服务器检索信息的小型iOs应用程序,我发现了非常有用的NSURLSessionDataTask。首先我使用了@property (nonatomic, strong) NSMutableArray *objectArray;
我在我的方法中称之为
- (void) createObjectsArrayFromUrl: (NSString *) url {
NSURL *URL = [NSURL URLWithString:url];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
if(error) {
//error handling
}
dispatch_async(dispatch_get_main_queue(), ^{
NSMutableDictionary *jsonDataDictionary = [objectModel getJsonData];
self.objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];
[[self collectionView] reloadData];
});
}];
[task resume];
}
一切都很顺利。现在,我想为更多的数组创建一个通用的方法,我想通过将数组传递给该方法,并在内部更新它来实现,如下所示:
- (void) createObjectsArrayFromUrl: (NSString *) url inArray: (NSMutableArray *) objectArray{
NSURL *URL = [NSURL URLWithString:url];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
if(error) {
//error handling
}
dispatch_async(dispatch_get_main_queue(), ^{
NSMutableDictionary *jsonDataDictionary = [objectModel getJsonData];
objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];
[[self collectionView] reloadData];
});
}];
[task resume];
}
但它给了我以下行标题中的错误:objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];
,我不知道如何继续。所以我的想法是,我不想像以前那样为我拥有的每个数组创建一个方法,而是想将数组作为变量传递,并在方法中更新它。如何做到这一点?谢谢
如果您想访问块中的变量,那么您应该像__block NSArray *arr;
一样首先将其分配为块。然后您可以在完成处理程序中访问block means中的变量。
在您的代码中,您可以在方法体的开头添加一行,如
__block NSArray *arr = objectArray;
然后在类似块的中使用这个arr
arr = [objectModel arrayFromDictionary:jsonDataDictionary];
希望这将有所帮助:)
而不是
objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];
尝试
[objecyArray removeAllObjects];
[objectArray addObjectsFromArray:[objectModel arrayFromDictionary:jsonDataDictionary]];
这是因为进入的变量前面没有__block
,因此可以在块中使用,这只适用于局部变量,而不适用于参数。我相信__block
是在允许在块内引用的情况下做的。